Toon posts:

[All Languages]Alternatieve Programmeer Webstrijd

Pagina: 1 2 Laatste
Acties:
  • 443 views sinds 30-01-2008
  • Reageer

  • tomato
  • Registratie: November 1999
  • Niet online
Op donderdag 08 november 2001 17:01 schreef Cheatah het volgende:
Als je je programma wiskundig kunt onderbouwen met een strak bewijs, dan is het niet nodig om het te gaan controleren.
Dan ben ik erg benieuwd naar jouw wiskundig bewijs :)

Verwijderd

Op donderdag 08 november 2001 17:07 schreef tomato het volgende:

Dan ben ik erg benieuwd naar jouw wiskundig bewijs :)
Dat is ook het hele probleem: het programmeren is denk ik eenvoudiger dan het bewijs leveren.

Verwijderd

Topicstarter
Niet alleen een bikkel, maar heb je on the fly ook ff het P=NP probleem opgelost...
Idd, en dat noem ik nou een bikkel :)

edit:

Dit geldt overigens alleen als het bepalen of een bepaalde route een kortst mogelijke route is, een NP-Compleet probleem is. Ik weet zo niet uit mijn hoofd of dat zo is. Jij wel?

  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 08-12-2025

Tsjipmanz

Der Rudi ist da

Op donderdag 08 november 2001 16:48 schreef Janoz het volgende:

[..]

Waarom moeten we trouwens gebruik maken van Pythagoras? Manhattendistance werkt wat sneller, en het maakt uiteindelijk voor het algoritme niet zo veel uit..(wel voor de antwoorden)
Leuk en aardig, Janoz, maar ik denk dat je als datastructuur voor dit probleem toch eerder een gewogen graaf gaat gebruiken (tenminste als je dit als een soort TSP ziet).

De preprocessing om de 50 punten en de afstanden in een bruikbare graaf te zetten zal een fractie zijn van de probleemoplossingstijd, of je nu Pythagoras gebruikt of Manhattan.

Of zie ik t nou weer eens verkeerd :?

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


Verwijderd

Topicstarter
Waarom moeten we trouwens gebruik maken van Pythagoras? Manhattendistance werkt wat sneller, en het maakt uiteindelijk voor het algoritme niet zo veel uit..(wel voor de antwoorden)
Dit was alleen om aan te geven wat ik onder de afstand tussen twee punten versta. Bij een daadwerkelijk implementatie neem ik aan dat we een matrix met de afstanden gaan gebruiken. Deze matrix hoeven we dus maar 1 keer te berekenen, met whatever methode.

Verwijderd

Op donderdag 08 november 2001 17:23 schreef Xalista het volgende:

Dit was alleen om aan te geven wat ik onder de afstand tussen twee punten versta. Bij een daadwerkelijk implementatie neem ik aan dat we een matrix met de afstanden gaan gebruiken. Deze matrix hoeven we dus maar 1 keer te berekenen, met whatever methode.
Inderdaad een goede oplossing om de berekening zo snel mogelijk te houden. Er is slechts één matrix van 49 bij 49 hiervoor nodig. Een peuleschil vergeleken met het overig benodigde geheugen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

Tsjipmanz
Reken eens uit hoeveel afstanden dat zijn :)
edit:
Oeps, denkfoutje.. Valt wel mee
.. Het lijkt me niet zo'n best idee om dit om te zetten naar een compleet verbonden graaf :) (alhoewel er wel een efficient triangulatie algoritme overheen gegooid kan worden, hierna edges gaan elimineren, en je komt waarschijnlijk el een heel eind..... * Janoz heeft al een ID Kom maar op met die punten!!!)


Xalista
Met een kleine aanpassing is het idd een NPC probleem (dan moet je als eis niet de kleinste, maar kleiner dan een vooraf ingestelde waarde nemen)

Tomato
Had ik al verbeterd toch ;)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 08-12-2025

Tsjipmanz

Der Rudi ist da

Op donderdag 08 november 2001 17:30 schreef Janoz het volgende:
Tsjipmanz
Reken eens uit hoeveel afstanden dat zijn :).. Het lijkt me niet zo'n best idee om dit om te zetten naar een compleet verbonden graaf :) (alhoewel er wel een efficient triangulatie algoritme overheen gegooid kan worden, hierna edges gaan elimineren, en je komt waarschijnlijk el een heel eind..... * Janoz heeft al een ID Kom maar op met die punten!!!)
Dat zijn vanuit punt:

1 : 49 afstanden (naar 2-50)
2 : 48 afstanden (naar 3-50)
[...]
49 : 1 afstand (naar 50)

In totaal dus 1+2+3+...+49 = 50*50/2= 1250 afstanden!

Foei Gijs :)

edit:
Toen ik begon te typen had je je denkfoutje nog niet neergezet :) lekker puh

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


Verwijderd

Topicstarter
Ok, om ff te recapituleren.

Het vinden van de korste route is misschien toch niet zo'n leuke wedstrijd omdat het controleren of het de korste is net zo moeilijk is als het vinden ervan.

Je weet alleen zeker dat een oplossing de korste is als je alle mogelijkheden hebt uitgeprobeerd, of een met een wiskundig bewijs een upper- en een lowerbound hebt gedefineerd die aan elkaar gelijk zijn.

Vinden van de beste oplossing tot dan toe is wel een leuk (en makkelijk controleerbaar) probleem. Iedereen kan eraan mee doen: Die-hards met een distributed Bruteforce oplossing en slimmerikken met een handige heuristiek.

In pricipe komt hier niet al teveel super ingewikkeld programmeer werk bij kijken (voornamelijk array manipulatie) en dat maakt het probleem voor veel mensen toegankelijk.

Nogmaals, om er echt een wedstrijd van te maken moet iemand ff zeg 50 random punten posten. Met die punten kun je allerlei wedstrijden maken: b.v. de korste route door de eerste 20, 30, 40 of 50(voor de echte die hards) punten.

  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 08-12-2025

Tsjipmanz

Der Rudi ist da

Op donderdag 08 november 2001 17:34 schreef Xalista het volgende:

Nogmaals, om er echt een wedstrijd van te maken moet iemand ff zeg 50 random punten posten. Met die punten kun je allerlei wedstrijden maken: b.v. de korste route door de eerste 20, 30, 40 of 50(voor de echte die hards) punten.
Hoeveel punten het ook zijn, het gaat om het algoritme... ipv die-hards kan je misschien beter praten over mensen die een supercomputer in hun achtertuin hebben staan ! :)

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

Count me in (mits de tijd het toe laat) Mischien is er (als er veel mensen mee doen) ook wel een opsplitsing te maken in verschillende categorieën.. Brute force en trucjes.. Op die manier kunnen de brute forcers op 1 set gaan werken, terwijl de 'slimmerikken' op verschillende type datasets hun skills los kunnen laten..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Op donderdag 08 november 2001 17:40 schreef Tsjipmanz het volgende:

[..]

Hoeveel punten het ook zijn, het gaat om het algoritme... ipv die-hards kan je misschien beter praten over mensen die een supercomputer in hun achtertuin hebben staan ! :)
Bedenk een algoritme, deze hoeft niet daadwerkelijk uitgevoerd te worden, als je maar kunt zien dat het werkt.

Voor een daadwerkelijke berekening is een 10tal punten wel genoeg. Als het daarvoor geldt, dan geldt het ook voor 50 punten.

[edit]
*knip*

Verwijderd

Topicstarter
Ok, hier zijn 50 punten in de range [0..50,0..50], maar die range doet er eigenlijk niet toe. Het gaat om de afstanden tussen de punten.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
06 05
49 30
42 23
33 06
02 32
36 20
35 19
13 29
22 34
18 41
23 49
05 26
12 24
18 45
21 03
44 33
50 08
31 10
37 26
02 46
35 08
23 44
45 36
18 27
30 32
01 09
05 23
19 39
30 50
43 48
24 37
40 10
31 26
46 12
48 31
27 24
36 03
39 37
04 06
34 40
01 34
15 30
36 15
11 39
29 19
25 03
13 11
30 00
36 07
35 22

Ik stel voor dat we deze punten nummeren van 0 t/m 49, in de volgorde zoals ze er nu staan. Je kunt dan een oplossing geven door de nummers 0 t/m 49 in een bepaalde volgorde te posten.

Zelf ga ik proberen met een brute force algoritme de kortste route door de eerste 20 punten te vinden. Daarna voeg ik me bij de groep 'slimmerikken' en ga proberen een zo kort mogelijke route te vinden door de eerste 30 punten. Daarna eventueel door 40 en 50 punten. Iedereen veel plezier en ik zie wel met welke oplossingen jullie komen.

Verwijderd

Topicstarter
edit:

laat maar

Verwijderd

Xalista: oops :D

Plak jij je punten effe terug ?

[edit]

Ik doe brute-force, en zal ook de eerste 20 punten gebruiken.

Verwijderd

Voorlopig heb ik in Java dit ervan gebakken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Route
{
    public static void main(String[] args)
    {
        int match = 0;
        int[] sequence = new int[4];

        for (int a = 1; a <= 4; a++)
        {
            sequence[0] = a;
            match = 0;
            for (int x = 0; x < 0; x++)
            {
                if (sequence[x] == a) match++;
            }
            if (match == 0)
            {
                for (int b = 1; b <= 4; b++)
                {
                    sequence[1] = b;
                    match = 0;
                    for (int x = 0; x < 1; x++)
                    {
                        if (sequence[x] == b) match++;
                    }
                    if (match == 0)
                    {
                        for (int c = 1; c <= 4; c++)
                        {
                            sequence[2] = c;
                            match = 0;
                            for (int x = 0; x < 2; x++)
                            {
                                if (sequence[x] == c) match++;
                            }
                            if (match == 0)
                            {
                                for (int d = 1; d <= 4; d++)
                                {
                                    sequence[3] = d;
                                    match = 0;
                                    for (int x = 0; x < 3; x++)
                                    {
                                        if (sequence[x] == d) match++;
                                    }
                                    if (match == 0)
                                    {
                                        System.out.println(">" + sequence[0] + sequence[1] + sequence[2] + sequence[3]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Dit levert alle mogelijke combinaties van de volgorde van de cijfers 1 2 3 en 4.

Maar zoals ik al eerder zei is het bij grotere getallen ranzige code. Dit is heel goed door te zetten tot 50 cijfers, uiteindelijk krijg je iedere keer een array met alle 50 getallen erin, iedere keer in een andere volgorde.

Nu moet dit worden teruggebracht naar één functie met behulp van een recursive call.
Iets in de geest van het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void loop(int n)
{
    for (int a = 1; a <= 4; a++)
    {
        sequence[n] = a;
        match = 0;
        for (int x = 0; x < n; x++)
        {
            if (sequence[x] == a) match++;
        }
        if (match == 0)
        {
            if (n < 4)
            {
                loop(n+1);
            }
            else
            {
                System.out.println(">" + sequence[0] + sequence[1] + sequence[2] + sequence[3]);
            }
        }
    }
}

Het is me nog niet gelukt het aan het werk te krijgen.
De 'lelijke' versie werkt in ieder geval, in plaats van de System.out.println(); moet dan een berekening van de totale lengte van het af te leggen traject komen, en een vergelijking met de tot dan toe kortste afstand.
:P

Verwijderd

Topicstarter
Wow, dat is wel heel erg bruteforce.

Ik heb het iets subtieler aangepakt, een branch and bound methode.

Ik heb al wat resultaten, maar ik betwijfel of dit voor 20 punten te doen is.
Dit zijn (volgens mij) de korste afstanden van de routes door de eerste X punten. Ik moet m'n algoritme nog even aanpassen zodat ie ook de routes uitspugt waar de afstand voor geldt, maar dat komt nog.

<removed due to bug> :'(

Zo, nu begint het echt tijd te kosten. Voor 20 punten zal het wel meerdere uren kosten. Eerst maar eens wat routes meeleveren.

Verwijderd

Op donderdag 08 november 2001 21:00 schreef Xalista het volgende:
Wow, dat is wel heel erg bruteforce.

Ik heb het iets subtieler aangepakt, een branch and bound methode.

Ik heb al wat resultaten, maar ik betwijfel of dit voor 20 punten te doen is.
Dit zijn (volgens mij) de korste afstanden van de routes door de eerste X punten. Ik moet m'n algoritme nog even aanpassen zodat ie ook de routes uitspugt waar de afstand voor geldt, maar dat komt nog.
In welke taal heb je dit geschreven?

En die branch en bound methode, weet je daarmee 100% zeker dat er niet meerderekortere mogelijkheden zijn?

Verwijderd

Topicstarter
Op donderdag 08 november 2001 21:06 schreef Cheatah het volgende:

[..]

In welke taal heb je dit geschreven?

En die branch en bound methode, weet je daarmee 100% zeker dat er niet meerderekortere mogelijkheden zijn?
In Delphi. Die branch and bound methode geeft me de korste afstand. Het kan natuurlijk zijn dat er een aantal routes zijn met die afstand, maar er zal nooit een route zijn met een kortere afstand. O, btw ik heb een bug gevonden in m'n progje, dus negeer die resultaten van net maar ff.

Verwijderd

Topicstarter
Ok, nu zijn de bugs eruit. Hier zijn mijn resultaten:

5 punten
Afstand: 130,490613243764
Duur: 00:00:00
Route: 0 3 2 1 4

10 punten
Afstand: 145,246759296736
Duur: 00:00:00
Route: 0 3 6 5 2 1 8 9 7 4

13 punten:
Afstand: 163,502651322452
Duur: 00:00:03
Route: 0 12 11 4 7 8 9 10 1 2 5 6 3

14 punten:
Afstand: 164,471794343377
Duur: 00:00:13
Route: 0 12 11 4 7 8 9 13 10 1 2 5 6 3

15 punten
Afstand: 164,955344732085
Duur: 00:00:32
Route: 0 14 3 6 5 2 1 10 13 9 8 7 4 11 12

17 punten
Afstand: 187,549937805454
Duur: 00:29:55
Route: 0 14 3 16 6 5 2 1 15 10 13 9 8 7 4 11 12

Het lijkt me dat 20 punten exact dus wel een beetje lang gaat duren. Ik schat ruim een week. Begin ik dus verder maar niet aan. Voor de fun ga ik morgen wel zitten stampen op 18 punten. >:)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

Ik heb gister nog ff over het probleem nagedacht, en heb de complexiteit al kunnen terugbrengen van een 'faculteit'-complexiteit naar een exponentiele complexiteit.. En heb ook nog een bewijs bedacht dat je dan nog steeds de minimale route overhoud :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Leuke opdracht, count me in.

Ik zou er iedereen nog wel weer even op wijzen dat (zoals Cheetah al eerder gemeld heeft) de route weer moet eindigen op het eindpunt...

Verwijderd

Topicstarter
Op vrijdag 09 november 2001 08:22 schreef Janoz het volgende:
Ik heb gister nog ff over het probleem nagedacht, en heb de complexiteit al kunnen terugbrengen van een 'faculteit'-complexiteit naar een exponentiele complexiteit.. En heb ook nog een bewijs bedacht dat je dan nog steeds de minimale route overhoud :)
Dat idee, en het bewijs, zou ik wel eens willen zien.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

Op vrijdag 09 november 2001 09:46 schreef Xalista het volgende:

[..]

Dat idee, en het bewijs, zou ik wel eens willen zien.
Ik heb het nog niet helemaal uitgewerkt, maar het maakt gebruik van het feit dat eindpunt=beginpunt, en dat alle punten in hetzelfde vlak liggen. Voor een route waarvoor geldt eindpunt =/= beginpunt gaat het niet op (Dus nee, ik heb niet het TSP opgelost :) )

Maar ja, een exponentiele complexiteit is ook nog erg zwaar :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

Sorry, brak Got

Zit ik thuis een antwoord te posten krijg ik de hele tijd timeouts, kijk ik op de pagina staan ze er niet bij, probeer ik het nog een keer, zelfde effect..

Kijk nu weer eens, staat mijn reactie d'r tig keer in ... hmm .. lekker is dat (En nee, ik doe het niet om aan techposts te komen :) )

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Op vrijdag 09 november 2001 10:04 schreef Janoz het volgende:
Maakt gebruik van het feit beginpunt==eindpunt en dat alle punten in 1 vlak liggen... Het bewijs gaat niet op voor het TSP omdat dat niet een cycle is..
Huh? Volgens mij is het TSP wel een cykel (dwz. een gesloten wandeling door een graaf waarbij alle punten behalve het begin- en het eindpunt verschillend zijn), en zelfs een Hamilton-cykel (een cykel door alle punten van de graaf).

Verwijderd

Is er trouwens een vast beginpunt?

edit:

Lijkt me een beetje stom als een handelaar eerst de kortste route berekent en dan nog eerst naar het startpunt moet reizen voor ie begint :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

Op vrijdag 09 november 2001 11:24 schreef fladder het volgende:
Is er trouwens een vast beginpunt?

edit:

Lijkt me een beetje stom als een handelaar eerst de kortste route berekent en dan nog eerst naar het startpunt moet reizen voor ie begint :)
Het is nu een cycle.. Dus het maakt niet uit bij welk punt je begint.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Op vrijdag 09 november 2001 11:02 schreef mietje het volgende:

[..]

Huh? Volgens mij is het TSP wel een cykel (dwz. een gesloten wandeling door een graaf waarbij alle punten behalve het begin- en het eindpunt verschillend zijn), en zelfs een Hamilton-cykel (een cykel door alle punten van de graaf).
Idd.

BTW,
Voor de eerste 18 punten is de kortste nu ook bekend.

18 punten.
Afstand: 191,85930182215
Duur: 02:27:03
Route: 0 12 11 4 7 8 9 13 10 15 1 2 5 6 16 3 17 14

Ik schat dat 19 punten dus een uurtje of 15 gaat kosten. Ik zal em morgen vroeg eens laten beginnen, dan is ie tegen middernacht wel klaar :)

Verwijderd

Topicstarter
Zijn er behalve Cheetah en ik eigenlijk nog mensen bezig met een oplossing?

Met een kick ass heuristiek kun je een goede route maken door 30-50 punten, en aangezien brute force op zoveel punten haast ondoenlijk is begint de wedstrijd dan pas echt goed.

Verwijderd

Op vrijdag 09 november 2001 12:36 schreef Xalista het volgende:
Zijn er behalve Cheetah en ik eigenlijk nog mensen bezig met een oplossing?
Ik zit op 20 punten te stampen, maar ik zit achter een p200 :) Als ik op m'n werk ben laat ik een servertje een weekend op 22 punten of zo stampen.
Met een kick ass heuristiek kun je een goede route maken door 30-50 punten, en aangezien brute force op zoveel punten haast ondoenlijk is begint de wedstrijd dan pas echt goed.
Ik gebruik ook een branch en bound en ik cap de bound door eerst een heuristiek toe te passen (weg van de kortste paden). Verder controlleer ik nog of ik geen symmerische oplossingen zit te berekenen (bv. wandeling 1 2 3 1 tov. 1 3 2 1).

Verwijderd

Topicstarter
Op vrijdag 09 november 2001 12:47 schreef mietje het volgende:

[..]

Ik gebruik ook een branch en bound en ik cap de bound door eerst een heuristiek toe te passen (weg van de kortste paden). Verder controlleer ik nog of ik geen symmerische oplossingen zit te berekenen (bv. wandeling 1 2 3 1 tov. 1 3 2 1).
Dat eerste doe ik dus ook. Dat tweede is wel slim, ff kijken of ik dat er bij mij ook op een simpele manier in kan bouwen.

Verwijderd

Xalista: ik heb nog een ideetje wat jouw berekeningen gi-gan-tisch gaat verkorten *D

Ik ga er even aan schrijven :P

Dat betekent inderdaad dat ik van de brute-force methode afstap, en wat strategischer ga werken :)

Verwijderd

Topicstarter
Da's goed, zolang je maar blijft vermelden of je gegarandeerd de kortst oplossing berekend of een goede benadering.

ff BTW, branch and bound is ook brute force hoor en het doet niks met de complexiteit van je programma. Door branch and bound wordt je programma hooguit een constante sneller, maar als die constante toevallig 10 is, is het voor een beperkt aantal punten toch nog interesant.

edit:

Oh, en het lijkt me voor zich spreken dat je methode geen gebruik mag maken van iemand anders' resultaten...
M.a.w. Je progje moet het ook doen op een andere verzameling punten.

  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 08-12-2025

Tsjipmanz

Der Rudi ist da

Ik ben benieuwd wanneer (en natuurlijk OF) Janoz' idee wordt uitgewerkt. :)

Had op zich ook wel even mee willen doen maar dan moet ik er weer tijd in steken en daar heb ik even geen zin in.
Ben benieuwd of er ook mensen zijn die genetische algoritmen gaan proberen...

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


Verwijderd

Op vrijdag 09 november 2001 13:58 schreef Xalista het volgende:
ff BTW, branch and bound is ook brute force hoor en het doet niks met de complexiteit van je programma. Door branch and bound wordt je programma hooguit een constante sneller, maar als die constante toevallig 10 is, is het voor een beperkt aantal punten toch nog interesant.
Als je nu eens een rij van bounds neemt zodat je voor elke stap in je algoritme een andere bound hebt. De grootste bound bereken je via relatief simpele heuritische algoritme. Dan heb je de bounds[n]. (n = aantal punten)
de bounds[n-1] = bounds[n] - de korste afstand tussen 2 punten. bounds[n-2] = bound[n]-de kortst mogelijke route tussen 3 punten enz.
voor bounds[n-x] kun je ook nemen bound[n]- x keer de korste afstand tussen twee punten dat is sneller te berekenen maar minder precies.
Als op deze manier de bounds gebruikt in plaats van eentje wordt de complexiteit wel degelijk minder :)

Verwijderd

Topicstarter
Op vrijdag 09 november 2001 14:27 schreef borganism het volgende:

[..]

Als je nu eens een rij van bounds neemt zodat je voor elke stap in je algoritme een andere bound hebt. De grootste bound bereken je via relatief simpele heuritische algoritme. Dan heb je de bounds[n]. (n = aantal punten)
de bounds[n-1] = bounds[n] - de korste afstand tussen 2 punten. bounds[n-2] = bound[n]-de kortst mogelijke route tussen 3 punten enz.
voor bounds[n-x] kun je ook nemen bound[n]- x keer de korste afstand tussen twee punten dat is sneller te berekenen maar minder precies.
Als op deze manier de bounds gebruikt in plaats van eentje wordt de complexiteit wel degelijk minder :)
Teneerste, als je gelijk zou hebben, heb je zojuist bewezen dat P=NP. Dan zou ik als ik jou was gelijk wat je hierboven hebt uitgelegd uitprinten en bij een universiteit indienen. Je bent dan per direct gepromoveerd, en vervolgens kun je overal aan de slag als professor in de combinatorische optimalisatie.

Ten tweede, laat dat teneerste maar zitten, want je hebt geen gelijk. Je gaat ervan uit dat door het toevoegen van een punt aan een route de lengte groter moet worden, maar dat is niet zo. Als dat punt toevallig op de beste route zonder dat punt ligt blijft de lengte van je route gelijk. Kortom jij denkt dat je een bounds[n] array kunt maken dat "increasing" is, maar dat is niet zo. Helaas, maar goed geprobeerd, ik vond het een leuk idee.

Verwijderd

Ik heb een oplossing met lengte 311,90. Deze heb ik gekregen door de punten in groepen te verdelen [door te kijken welke punten dicht bij elkaar liggen]; aan elk van deze groepen met punten een beginpunt en een eindpunt te geven; hierna tussen begin- en eindpunt het optimale pad berekent; en tenslotte hiervan 1 pad door de alle punten gemaakt.

Ik ga nu nog effe kijken of ik door punten in het gevonden pad te switchen een betere oplossing kan krijgen...

Verwijderd

Topicstarter
Op vrijdag 09 november 2001 16:11 schreef DiFool het volgende:
Ik heb een oplossing met lengte 311,90. Deze heb ik gekregen door de punten in groepen te verdelen [door te kijken welke punten dicht bij elkaar liggen]; aan elk van deze groepen met punten een beginpunt en een eindpunt te geven; hierna tussen begin- en eindpunt het optimale pad berekent; en tenslotte hiervan 1 pad door de alle punten gemaakt.

Ik ga nu nog effe kijken of ik door punten in het gevonden pad te switchen een betere oplossing kan krijgen...
Door hoeveel punten gaat je route?

Verwijderd

Op vrijdag 09 november 2001 16:25 schreef Xalista het volgende:

[..]

Door hoeveel punten gaat je route?
Allemaal :)

Verwijderd

Update: 310,11 -> 305,28

Verwijderd

Topicstarter
Ik ben nu begonnen aan DE heuristiek voor het benaderen van TSP's, maar dat is nog best wat werk. Hopelijk heeft niemand dezelfde methode af voor mij >:)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Ik heb de vorige 10 minuten ook even wat uitgeprobeerd, wel wat simpel:
Afbeeldingslocatie: http://httpd.chello.nl/~j.vos6/tweakers/route1.jpg

Is het iets of ben ik weer es dom bezig? :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • tomato
  • Registratie: November 1999
  • Niet online
jelmervos: Is het iets of ben ik weer es dom bezig? :)
Het is iig niet de kortste route, dat kun je direct al zien >:)

Verwijderd

Op vrijdag 09 november 2001 21:25 schreef tomato het volgende:

[..]

Het is iig niet de kortste route, dat kun je direct al zien >:)
Hoe zie jij dat :?

Verwijderd

Brute Force??????

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op vrijdag 09 november 2001 21:25 schreef tomato het volgende:

[..]

Het is iig niet de kortste route, dat kun je direct al zien >:)
Kan wel, wat ik doe is dit:
Ik pak het eerste punt en zoek het punt wat het dichst bij ligt, daar gaat een lijn heen, dan de volgende, enz.

Lekker simpel dus, en daarom denk ik ook dat het niet echt klopt, dus dat er betere zijn. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

jelmervos: Misschien ben ik scheel maar waar zijn de punten (5, 23) en (5, 26) in jouw tekening; en waar is positie (0, 0), links-boven?

  • tomato
  • Registratie: November 1999
  • Niet online
DiFool: Misschien ben ik scheel maar waar zijn de punten (5, 23) en (5, 26) in jouw tekening; en waar is positie (0, 0), links-boven?
Hij genereert eerst zelf steeds een reeks punten en gebruikt dus niet de hier gegeven reeks.

  • tomato
  • Registratie: November 1999
  • Niet online
dev: Hoe zie jij dat :?
Heel simpel, ik zie stukjes in zijn route (bijvoorbeeld linksonder) waar je het 'draadje' langs kunt leggen op een kortere manier ;)
Als een deel van de route te optimaliseren is, is de totale route dus ook niet optimaal. Maar als je zulke stukjes niet meer 1 2 3 ziet in het plaatje wil dat nog niet zeggen dat het wel de optimale route is.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 28-12-2025
Dit is een probleem wat erom vraagt om in een boom gezet te worden.

Eerst verbind je alle punten met alle punten. Voilla, je basis boom. (spagetti zooitje)

Vervolgens ga je daar alsmaar padden uit weg srepen op een slimme manier en zodoende hou je uiteindelijk met een ACCEPTABELE REKENTIJD een redelijk geoptimaliseerde route over. Afhankelijk van je algoritme kun je ervoor zorgen dat je een beter resultaat hebt tegenover de rekentijd.

Hoe het werkt?

Een mogelijke oplossing zou zijn om alsmaar van ieder punt 1 route weg te strepen. Welke? De langste natuurlijk. Net zolang totdat alle punten nog maar 1 in en 1 uit route heeft. (op je begin en eindpunt na dan, tenzij dit hetzelfde punt is)

Uiteraard hoe beter je dit algoritme implementeert hoe beter. Een eerste verbetering zou al zijn om te beginnen bij de punten die de meeste verbindingen hebben. Of alle gekruisde routes eerst filteren, Kruisingen geven namelijk aan dat er iets niet oged is gegaan.

Wat je eigenlijk wil bereiken is een depth first tree met indien mogelijk slechts 1 draad van begin tot eind over de korste paden die mogelijk zijn.

Conceptueel en op papier heel makkelijk te bedenken en uit te voeren, maar doe het nu maar is in code. *uche* Moet wel te doen zijn, is ook geen probleem. Enige nadeel is dat het behoorlijk rekenintensief is. En dat de allerbeste oplossing gewoon teveel rekentijd vergt om in de praktijk toepasbaar te zijn. Je wil namelijk wel hebben dat de volgende ochtend er een route klaarligt voor AL je vertegenwoordigers en niet een paar perfecte voor een deel van je buitendienst. Daarnaast zijn er ook nog de volgende problemen in de praktijk: is afstand in kilometers wel de beste maatstaaf. Ok nemen we reistijd. Ligt die vast met de verkeersellende van tegenwoordig.... Hmmm, lastig.

Het zou bijvoorbeeld kunnen dat het effectiever blijkt te zijn in de praktijk om eerst dicht bij huis te beginnen, vervolgens (na de ochtend-spits) de punten op grote afstand te doen om vervolgens (voor de avond-spits) dicht bij huis nog wat afspraken af te lopen.

Oh ja, in m'n derde jaars stage ben ik hier mee bezig geweest. Alhoewel het toen zo was dat er al een bestaande route was die vervolgens aangepast moest worden met 1 voor 1 binnenkomende afspraken. En de geplande tijden voor de afspraken mochten niet gewijzigd worden. M.a.w.: Hoofdbrekens misselijkmakend moeilijk om op te lossen. Maar het was wel erg leuk om te zien dat het uiteindelijk wel werkte tijdens mijn eindpresentatie (dankzij de op voorhand nauwkeurig bepaalde en geteste afspraken set). >:) Weet de stage mentor van school veel. Het bedrijf was op de hoogte van deze problematiek en was onder de indruk van de inzichten die ik ze heb kunnen verschaffen.

Ik zie dat ik al weer een veeeeel te lang verhaal getyped heb. :P Tijd om een slaapje te doen lijkt me... :Z

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Cool zo'n uitleg, volgen er meer?
Is namelijk intressant om te lezen. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • tomato
  • Registratie: November 1999
  • Niet online
The - DDD: Een mogelijke oplossing zou zijn om alsmaar van ieder punt 1 route weg te strepen. Welke? De langste natuurlijk. Net zolang totdat alle punten nog maar 1 in en 1 uit route heeft. (op je begin en eindpunt na dan, tenzij dit hetzelfde punt is)
Denk je er wel aan dat je een gesloten route moet hebben? Dus 8 korte routes die los liggen daar heb je niets aan :)

En begin- en eindpunt zijn dezelfde, dat was gegeven.

Verwijderd

Ik heb jullie discussie gelezen. Ik vraag me af of jullie toevallig een algoritme weten waarmee je binnen redelijke tijd zowel een graaf als een kortste route kan maken. Hierbij maak je dus eerder de graaf uit de kortste route dan de korste route uit de kortste graaf. De graaf hoeft slechts te worden gegeven door een afstandenmatrix met gehele getallen; het hoeft dus geen representatie hebben als een vlak met alle punten erop. In werkelijkheid is het trouwens toch ook zo dat de korste weg niet hemelsbreed is. Met dit algoritme kan je dus wél een graaf opgeven als jury waar jij een optimale route voor weet. En ik vind hem ook wel een leuke vervanging voor priemfactorisatie in public/private key encryptie. Dat is namelijk het onderwerp van mijn profielwerkstuk. Ik zoek namelijk snelle generatoren voor input van (voorlopige) NP-problemen bij gegeven output, die echter niet makkelijk te hacken is omdat de generator niet willekeurig genoeg is. Heeft iemand van jullie een idee (een ander NP-probleem is ook welkom)? Alvast bedankt!

Verwijderd

Op zaterdag 10 november 2001 00:09 schreef tomato het volgende:

[..]

Heel simpel, ik zie stukjes in zijn route (bijvoorbeeld linksonder) waar je het 'draadje' langs kunt leggen op een kortere manier ;)
Als een deel van de route te optimaliseren is, is de totale route dus ook niet optimaal. Maar als je zulke stukjes niet meer 1 2 3 ziet in het plaatje wil dat nog niet zeggen dat het wel de optimale route is.
Nu zie ik het ook, was niet helemaal wakker :)

Verwijderd

Topicstarter
Zelf heb ik als stage opdracht een heuristische zoekmethode moeten implementeren voor een Dial-a-Ride Probleem met meerdere voertuigen, multiple capacities en time windows. Dit probleem is nog veel complexer dan het TSP.

Omdat een aantal mensen het leuk vinden om te lezen zal ik hier een van de methoden bespreken (in het kort) die ik heb gebruikt.

De methode heet Simulated Annealing. Simulated annealing gaat uit van een willekeurige route door de punten. Vervolgens wordt er héél vaak (en daar ligt de kracht van deze methode) een hele kleine verandering in de route aangebracht. Zo'n verandering kan van alles zijn, b.v. het verplaatsen van een willekeurig punt binnen de route. Als die kleine verandering tot een kortere route leidt accepteer je hem altijd. Als de verandering tot een slechtere route leidt accepteer je hem met een bepaalde kans. Als je een verandering niet accepteerd moet je hem ongedaan maken. De kans is in het begin heel groot en wordt naarmate het proces (het simuleren) vorderd steeds kleiner. Dit zou je kunnen vergelijken met het bevriezen van een vloeistof of het condenseren van een gas, vandaar de naam Simulated Annealing. De reden om soms ook verslechterende veranderingen te accepteren is om uit lokale minima te kunnen komen. Een lokaal minimum is een route waarbij elke kleine verandering leidt tot een slechtere route terwijl het best kan zijn dat je met een iets grotere verandering een nog véél betere route kunt vinden. Als je dan nooit een slechtere route accepteerd kom je nooit uit dit lokale minimum, en vind je nooit de beste route.

Zo, als iemand dit implementeerd en hij kiest een paar leuke kleine veranderingen kan ie wel eens recordhouder worden bij problemen met heel veel punten (> 1000 bv)

Gesnapt?

Verwijderd

Topicstarter
Op zaterdag 10 november 2001 00:49 schreef The - DDD het volgende:
Dit is een probleem wat erom vraagt om in een boom gezet te worden.

[..]
Volgens mij probeer je hier uit te leggen dat je een minimaal opspannende boom door je punten moet maken en daaruit een route destileren. Dit is een bekende methode en het voordeel ervan is dat je gegarandeerd een route krijgt die maximaal 2 keer zo lang is als de optimale route.

Er zijn echter methodes die welliswaar niet zo'n worstcase garantie hebben, maar wel een (veel) betere avarage case behaviour. Er zijn methodes die "on avarage" routes produceren die maar 1,04 keer zo lang zijn als de optimale route.

Verwijderd

Mijn oplossing/idee:

Brute-force trek ik (maar vooral mijn peeceetje) niet.
Dus ik ga het op een andere manier oplossen.
De oplossing die ik gekozen heb is gebaseerd op wat kleine
testjes en de paden die op het beeldscherm zag verschijnen.

Stap 1)
Ik zag allemaal 'ronde' vormen voor de kortste route
verschijnen. Op zich logisch, omdat het een gesloten route
is. M.a.w. mijn eerste stap is om de punten te sorteren in
graden.
Bereken hiervoor het middelpunt van alle punten en
bereken voor elk punt de graden t.o.v. dit middelpunt en
sorteer deze...


Stap 2)
Je zal een route zien die soms van binnen naar buiten en
weer naar binnen gaat. Dit is natuurlijk niet snel.
M.a.w. probeer elke punt een andere plaats in de lijst te
geven en kijk of de route korter wordt...


En toen was er geen Stap 3 :)
Tis niet de kortste route, maar zoals de tekening hieronder
toont, heb ik een vrij korte route berekent in 1,27 seconde.

Afbeeldingslocatie: http://members.ams.chello.nl/d.van.emmerik/ts.png

Verwijderd

Ik zit nog steeds brute force te klooien :) Ik heb overigens wel een algoritme dat een stuk sneller is nu. (10 minuten voor 17 punten op een p200). Leuke is dat er nu geen heuristiek meer in het algoritme zit; ik sorteer alle punten op onderlinge afstand, en loop tijdens de recursie de punten van kleinste tot grootste afstand door (hierbij kun je nog steeds op symmetrie testen). Verder bound ik nog wat eerder door bij de actuele route de kleinste afstand tot het startpunt (0) op te tellen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Brute force is 30414093201713400000000000000000000000000000000000000000000000000 mogelijkheden testen! :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 28-12-2025
Op zaterdag 10 november 2001 12:30 schreef Xalista het volgende:

[..]

Volgens mij probeer je hier uit te leggen dat je een minimaal opspannende boom door je punten moet maken en daaruit een route destileren. Dit is een bekende methode en het voordeel ervan is dat je gegarandeerd een route krijgt die maximaal 2 keer zo lang is als de optimale route.

Er zijn echter methodes die welliswaar niet zo'n worstcase garantie hebben, maar wel een (veel) betere avarage case behaviour. Er zijn methodes die "on avarage" routes produceren die maar 1,04 keer zo lang zijn als de optimale route.
Ik heb het ook niet zelf getest :)

Ik denk zowiezo dat de beste methode een vorm van heuristiek zal zijn. Bijvoorbeeld eerst dicht bij elkaar liggende punten bewerken en een goede route voor maken. En dan de zo verkregen "eilandjes" weer zo optimaal mogelijk proberen te verbinden.

Of een aantal willekeurige locaties kiezen met als voorwaarde dat ze neit te dicht bij elkaar liggen en van daaruit gaan zoeken. Opties opties opties.

Verwijderd

Op zaterdag 10 november 2001 15:37 schreef jelmervos het volgende:
Brute force is 30414093201713400000000000000000000000000000000000000000000000000 mogelijkheden testen! :)
Wat knap dat jij weet hoeveel mogelijkheden ik test zonder mijn algoritme te kennnen :) (Je hoeft met een branch en bound niet alle mogelijkheden te testen.) Ik snap natuurlijk dat brute force niet haalbaar is met 50 punten, het gaat me erom dat brute force algoritme zo "slim" mogelijk te maken terwijl ik toch nog gegarandeerd de optimale oplossing vindt. Als je met met heuristieken werkt kun geen enkele garantie geven dat je oplossing ook optimaal is.

(Indicatie: 50 minuten voor 18 punten; ter vergelijking met de tijden die Xalista post, die waarschijnlijk een zwaardere pc heeft dan een 200Mhz pentium.)

Verwijderd

Topicstarter
Op zaterdag 10 november 2001 16:51 schreef mietje het volgende:

[..]

Wat knap dat jij weet hoeveel mogelijkheden ik test zonder mijn algoritme te kennnen :) (Je hoeft met een branch en bound niet alle mogelijkheden te testen.) Ik snap natuurlijk dat brute force niet haalbaar is met 50 punten, het gaat me erom dat brute force algoritme zo "slim" mogelijk te maken terwijl ik toch nog gegarandeerd de optimale oplossing vindt. Als je met met heuristieken werkt kun geen enkele garantie geven dat je oplossing ook optimaal is. Post ook eens wat resultaten (lengtes en routes)

(Indicatie: 50 minuten voor 18 punten; ter vergelijking met de tijden die Xalista post, die waarschijnlijk een zwaardere pc heeft dan een 200Mhz pentium.)
Da's zeker verrekte rap! Ik heb dan ook echt alleen maar een standaard brach and bound geïmplementeerd. Ik neem aan dat jij wel dezelfde resultaten krijgt als ik voor de aantalen die ik heb berekend. Ik zou best wat meer van je algoritme willen zien. Eventueel code. Je bent zeker in C bezig.

Verwijderd

Op zaterdag 10 november 2001 18:08 schreef Xalista het volgende:
Da's zeker verrekte rap! Ik heb dan ook echt alleen maar een standaard brach and bound geïmplementeerd. Ik neem aan dat jij wel dezelfde resultaten krijgt als ik voor de aantalen die ik heb berekend. Ik zou best wat meer van je algoritme willen zien. Eventueel code. Je bent zeker in C bezig.
Ik krijg natuurlijk de zelfde resultaten :) De code is nu 344 regels C++, ik weet niet of dat niet teveel van het goede is; als het geen probleem is post ik hem wel. (Ik zit er nog aan te optimizen, ik haal nu 39 minuten voor 18 punten.)

Verwijderd

Ben ook eens aan het proberen geslagen, gebruik makend van de 'naaste buur' methode heb ik een route gevonden van 343.814007209701 lang.
Deze methode is natuurlijk niet het optimaalst maar wel lekker snel :P
Ga vannacht nog wat verder klooien.

CoDeR Uit!

Afbeeldingslocatie: http://members.home.nl/kreunen/got.JPG

Verwijderd

Op zaterdag 10 november 2001 21:57 schreef CoDeR het volgende:
Ben ook eens aan het proberen geslagen, gebruik makend van de 'naaste buur' methode heb ik een route gevonden van 343.814007209701 lang.
Deze methode is natuurlijk niet het optimaalst maar wel lekker snel :P
Ga vannacht nog wat verder klooien.

CoDeR Uit!

[afbeelding]
Alle respect hoor, maar dat lijkt dus nergens op

Twee snijdende lijnen moet niet kunnen, dat is altijd een omweg namelijk.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 31-12-2025

Janoz

Moderator Devschuur®

!litemod

(Ik moet ook maar ff van me laten horen)

Ik ben al ff bezig geweest met mijn programma, maar ik moet nog allerlei graven datastructuren en algoritmes implementeren. Mijn werkwijze komt ongeveer overeen met wat DDD eerder ook al gepost heeft.

Om het van een facultatieve complexiteit terug te brengen naar een exponentiele gebruik ik een Delaunay triangulatie. Ik heb een bewijs bedacht (nog niet helemaal uitgewerkt) dat de ideale oplossing een subset van de edges is die wordt gegenereerd door die Delaunay triangulatie. Bij dat bewijs maak ik gebruik van het feit dat bij kruisende edges altijd een betere oplossing te vinden is. Daarnaast is mbv Euler te bewijzen dat (bij 50 punten) door de triangulatie van de 50! mogelijke edges slechts 98 over blijven.

Omdat een exponentieel algoritme natuurlijk nog steeds niet optimaal is ben ik nog aan het nadenken over de manier om hieruit een kleine route te krijgen.

(hoofdrekenfouten en denkfouten voorbehouden, ik ben namelijk niet helemaal zeker van de 98... Feit blijft dat de complexiteit naar beneden schiet :) )

[edit] Nog ff gerekend, het moeten er geen 98, maar 148 zijn.. het blijft iig recht evenredig met het aantal vertices, waardoor mijn beweringen nog wel kloppen)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Ik post ook nog maar een resultaatje :) De kortst mogelijke route over de eerste 19 punten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 0             0
14  15.1327459504216
17  27.3393015661553
 3  31.8114375211548
16  48.9286802897785
 6  67.5297555275168
 5  68.9439690898899
18  75.0267316201881
 2  80.8576835150334
 1  90.7571784516451
15  96.5881303464904
10  122.988887911379
13  129.392012148811
 9  133.392012148811
 8   141.45426989711
 7  151.749900038097
 4  163.151654289088
11  169.859858221588
12  177.139968110868
 0  197.064826956039

Tijd:   0/04:25:44.270

Is er nog belangstelling voor m'n code?

Verwijderd

Topicstarter
Op zondag 11 november 2001 00:34 schreef mietje het volgende:
Ik post ook nog maar een resultaatje :) De kortst mogelijke route over de eerste 19 punten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 0             0
14  15.1327459504216
17  27.3393015661553
 3  31.8114375211548
16  48.9286802897785
 6  67.5297555275168
 5  68.9439690898899
18  75.0267316201881
 2  80.8576835150334
 1  90.7571784516451
15  96.5881303464904
10  122.988887911379
13  129.392012148811
 9  133.392012148811
 8   141.45426989711
 7  151.749900038097
 4  163.151654289088
11  169.859858221588
12  177.139968110868
 0  197.064826956039

Tijd:   0/04:25:44.270

Is er nog belangstelling voor m'n code?
Ik heb wel belangstelling, kun je een link posten, 344 regels is wel een beetje teveel van het goede...

Verwijderd

Topicstarter
Op zaterdag 10 november 2001 15:14 schreef mietje het volgende:
Ik zit nog steeds brute force te klooien :) Ik heb overigens wel een algoritme dat een stuk sneller is nu. (10 minuten voor 17 punten op een p200). Leuke is dat er nu geen heuristiek meer in het algoritme zit; ik sorteer alle punten op onderlinge afstand, en loop tijdens de recursie de punten van kleinste tot grootste afstand door (hierbij kun je nog steeds op symmetrie testen). Verder bound ik nog wat eerder door bij de actuele route de kleinste afstand tot het startpunt (0) op te tellen.
Dat ik daar niet op ben gekomen zeg, dat laatste van die afstand naar het startpunt bedoel ik. Briliant (vandaar dat ik het raar vind dat ik er zelf niet op ben gekomen :P) Door dit ff toe te voegen (letterlijk het toevoegen van een halve regel code) ging bij mij de tijd om de beste route door 17 punten te vinden omlaag van 00:29:55 naar 00:01:23 !!!!
FF ter vergelijking, ik werk op een een Celeron 633@790 Mhz.

Mijn zooitje staat in 158 regels Delphi, incl. GUI (Die welliswaar echt geen ruk voorsteld)

Verwijderd

Kan een van de brute forcers deze lijst controleren? t/m 19 heb ik ze kunnen controleren met de resultaten van Xalista en Mietje, Mocht het kloppen dan heb ik 'n heeeeel snel algoritme (ik reken er niet op want hij heeft hier z'n nukken al maar hopen mag toch?! :Y))
code:
1
2
3
4
5
6
7
8
9
10
11
12
14:0 12 11 4 7 8 9 13 10 1 2 5 6 3  Distance: 164.471794462532780
15:0 14 3 6 5 2 1 10 13 9 8 7 4 11 12  Distance: 164.955345117594760
16:0 14 3 6 5 2 1 15 10 13 9 8 7 4 11 12  Distance: 164.984570201119000
17:0 14 3 16 6 5 2 1 15 10 13 9 8 7 4 11 12  Distance: 187.549941769515040
18:0 14 17 3 16 6 5 2 1 15 10 13 9 8 7 4 11 12  Distance: 191.859316463395370
19:0 14 17 3 16 6 5 18 2 1 15 10 13 9 8 7 4 11 12  Distance: 197.064826956039500
20:0 14 17 3 16 6 5 18 2 1 15 10 13 9 8 7 19 4 11 12  Distance: 219.911529436364700
21:0 14 17 3 20 16 6 5 18 2 1 15 10 13 9 8 7 19 4 11 12  Distance: 220.622713792487190
22:0 14 17 3 20 16 6 5 18 2 1 15 21 10 13 9 8 7 19 4 11 12  Distance: 222.928495409858410
23:0 14 17 3 20 16 6 5 18 2 1 15 22 21 10 13 9 8 7 19 4 11 12  Distance: 225.793633709206660
24:0 14 17 3 20 16 6 5 18 2 1 15 22 21 10 13 9 8 23 7 19 4 11 12  Distance: 228.945426123652740
25:0 14 17 3 20 16 6 5 18 2 1 15 22 24 21 10 13 9 8 23 7 19 4 11 12  Distance: 234.952644987923320

Verwijderd

Op zondag 11 november 2001 15:03 schreef Xalista het volgende:
Ik heb wel belangstelling, kun je een link posten, 344 regels is wel een beetje teveel van het goede...
Ok, je kunt hem vinden op http://www.xs4all.nl/~guyvago/got/handel.c (Waarschuwing: bijna 500 regels slecht ontworpen C++ zonder commentaar)

Dit is trouwens een nog geavanceerdere versie (18 punten in 8 minuten op mijn p200). Deze keer ga ik er ook nog van uit dat ik tijdens het brute forcen geen kruisende wandelingen mag veroorzaken. Dit kost wel nogal wat geheugen in mijn implementatie, maar dat ligt vooral er aan hoe de STL std::bit_vector geimplementeerd is, daar sla ik bits in op die aangeven of alle (n * (n-1) / 2) * ((n-2) * (n-3) / 2) mogelijke variaties van lijnen tussen punten elkaar kruisen.

Ik zit nog te klooien met het algoritme dat het kruisen van twee lijnstukken bepaalt, ik weet niet zeker of dat correct is en heb geen zin vectorclasses te gaan schrijven.
Op zondag 11 november 2001 15:14 schreef Xalista het volgende:
Dat ik daar niet op ben gekomen zeg, dat laatste van die afstand naar het startpunt bedoel ik. Briliant
/me bloost :)
Mijn zooitje staat in 158 regels Delphi, incl. GUI (Die welliswaar echt geen ruk voorsteld)
:) Die versie die ik boven link is nu 460 regels, puur console.

Verwijderd

Topicstarter
Op zondag 11 november 2001 16:28 schreef Yarvieh het volgende:
Kan een van de brute forcers deze lijst controleren? t/m 19 heb ik ze kunnen controleren met de resultaten van Xalista en Mietje, Mocht het kloppen dan heb ik 'n heeeeel snel algoritme (ik reken er niet op want hij heeft hier z'n nukken al maar hopen mag toch?! :Y))
code:
1
[..]
Ik ben welliswaar geen bruteforcer meer, maar ik kan je wel vertellen dat je algoritme niet exact is. (Wat je zelf ook al verwachte)
Ik heb met m'n eigen benaderings algoritme namelijk een route door 20 punten gevonden die korter is dan die van jouw.
Route door 20 punten.
Afstand: 212,859702849706
Duur: 00:00:00 (Tja, benaderen gaat wel ietsjes sneller dan exact :))
Route: 10 13 9 8 6 5 18 15 1 2 16 3 17 14 0 12 7 11 4 19

Het algoritme waar ik nu mee bezig ben is in de praktijk één van de beste benaderings algoritmes voor het TSP. Maar ik weet uit m'n hoofd niet precies hoe het werkt, dus werkt mijn implementatie ervan ook niet helemaal goed. Hij vindt nu wel goeie oplossingen, maar ook nog veel te vaak een hele slechte oplossing. Als ik hem goed krijg zal ik jullie vertellen welk algoritme het betreft en zal ik er iets over vertellen. Interesting Stuff :9

Verwijderd

Op maandag 12 november 2001 12:29 schreef Xalista het volgende:
Route door 20 punten.
Afstand: 212,859702849706
Duur: 00:00:00 (Tja, benaderen gaat wel ietsjes sneller dan exact :))
Route: 10 13 9 8 6 5 18 15 1 2 16 3 17 14 0 12 7 11 4 19
Dit is ook niet de best mogelijke route :) Ik heb nog een bugje uit m'n brute-forcer gehaald en hem eens op 20 punten losgelaten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 0             0
14  15.1327459504216
17  27.3393015661553
 3  31.8114375211548
16  48.9286802897785
 6  67.5297555275168
 5  68.9439690898899
 2  75.6521730223893
 1  85.5516679590009
15  91.3826198538462
18  101.282114790458
 8  118.282114790458
 9  126.344372538756
13  130.344372538756
10  136.747496776189
19  157.960700211786
 4  171.960700211786
11  178.668904144285
 7  187.212907889603
12  192.311927403195
 0  212.236786248367

Tijd:   0/00:32:39.960

Verwijderd

Topicstarter
Op maandag 12 november 2001 16:38 schreef mietje het volgende:

[..]

Dit is ook niet de best mogelijke route :) Ik heb nog een bugje uit m'n brute-forcer gehaald en hem eens op 20 punten losgelaten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 0             0
14  15.1327459504216
17  27.3393015661553
 3  31.8114375211548
16  48.9286802897785
 6  67.5297555275168
 5  68.9439690898899
 2  75.6521730223893
 1  85.5516679590009
15  91.3826198538462
18  101.282114790458
 8  118.282114790458
 9  126.344372538756
13  130.344372538756
10  136.747496776189
19  157.960700211786
 4  171.960700211786
11  178.668904144285
 7  187.212907889603
12  192.311927403195
 0  212.236786248367

Tijd:   0/00:32:39.960
Chapeau!
Maar ik zie op internet implementaties die echt schandalig snel zijn. Moet je hier eens kijken. Die java applet heeft een knop die in een flits de optimale route door 25 punten uitrekent. :o

Ik ben de hele dag een beetje bezig geweest om mijn benaderings algoritme aan de gang te krijgen, maar dat is dus echt voor geen meter gelukt :(. Toch maar eerst ff opzoeken hoe dat algoritme nou echt werkt. Dat wordt dus morgen.

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 12-11-2025
Ik ben ook maar eens begonnen, met een benader-algoritme, en kom op de volgende antwoorden uit:

10: 164,263073914482
15: 170,045298403029
16: 170,281936670863
17: 224,52893545121
18: 215,73855651718
19: 203,384677221841
20: 225,899021602838
25: 276,576176803398
30: 309,156097175675
50: 317,940488421684

Zoals je kunt zien is het niet perfect (kijk maar eens naar de uitkomst van 19, en vergelijk deze met die van 17 en 18)
maar geeft hij soms toch best goede benaderingen

Zouden anderen die ook met een benaderings-methode bezig zijn hun resultaten kunnen posten?

edit:

Mijn route voor 50:
0 14 45 47 36 3 17 20 48 31 16 33 42 6 5 49 44 35 32 18 2 1 34 15 22 37 24 39 29 28 10 21 13 9 27 30 8 43 19 40 4 11 26 7 41 23 12 46 25 38
en een screenie:
Afbeeldingslocatie: http://www.nmotion.nl/tweakers/screen.PNG

Verwijderd

Plaatje, lengte 305,28, alleen begin is anders:

Afbeeldingslocatie: http://picserv.mediamonks.nl/pics/ESEEDHPOHHE

Verwijderd

Ik kan helaas geen sjieke schermpjes posten, maar wel optimale resultaten >:)

21 punten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 0             0
14  15.1327459504216
17  27.3393015661553
 3  31.8114375211548
20   34.639864645901
16   49.639864645901
 6  68.2409398836393
 5  69.6551534460124
 2  76.3633573785118
 1  86.2628523151234
15  92.0938042099687
18   101.99329914658
 8   118.99329914658
 9  127.055556894879
13  131.055556894879
10  137.458681132312
19  158.671884567908
 4  172.671884567908
11  179.380088500408
 7  187.924092245725
12  193.023111759318
 0  212.947970604489

Tijd:   0/00:24:57.112

(Ik ben overgestapt naar de server op het werk, en het zit er naar uit dat ik tot 25 punten wel in redelijke tijd berekenen kan.)

  • StarLite
  • Registratie: Januari 2000
  • Laatst online: 01-12-2025

StarLite

'ON ERROR RESUME NEXT

Op dinsdag 13 november 2001 09:49 schreef mietje het volgende:
Tijd: 0/00:24:57.112[/code]
(Ik ben overgestapt naar de server op het werk, en het zit er naar uit dat ik tot 25 punten wel in redelijke tijd berekenen kan.)
Goh.. Waarom is de fileserver nou toch zo traag¿ en het downloaden schiet ook al voor geen meter op ;)

tyrips, tywreps, tiewreps, tiereps, tie raps, ripties, taiwraps, kabelbindbandjes » Tie Wraps
\o/


Verwijderd

Op dinsdag 13 november 2001 00:23 schreef DiFool het volgende:
Plaatje, lengte 305,28, alleen begin is anders:

[afbeelding]
Ziet er goed uit. Ik ben benieuwd of iemand nog lager komt :)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 28-12-2025
Op maandag 12 november 2001 17:18 schreef Xalista het volgende:

[..]
Maar ik zie op internet implementaties die echt schandalig snel zijn. Moet je hier eens kijken. Die java applet heeft een knop die in een flits de optimale route door 25 punten uitrekent. :o
[..]
Wat was ook alweer een goeie java decompiler? >:)

  • goalgetter
  • Registratie: Juni 1999
  • Laatst online: 14-11-2025
Die rekent niet de optimale route uit, maar zoals eronder staat een redelijke route die gebaseerd is op het nearest neighbour principe. Excuus, niet vergenoeg naar beneneden gescrolled :( Inderdaad smerig snel die oplossing.

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 12-11-2025
Op dinsdag 13 november 2001 19:51 schreef dev het volgende:

[..]

Ziet er goed uit. Ik ben benieuwd of iemand nog lager komt :)
Ik heb mijn "algoritme" (tis niet echt een algoritme, maar een zooitje van verschillende loops die met een bepaalde volgorde worden uitgevoerd) wat geoptimaliseerd en kom nu op dezelfde route uit, en ook na handmatig proberen te optimaliseren kom ik niet op een kortere route uit, de kans dat iemand hier lager mee komt schat ik heel laag

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 11-12-2025
Op donderdag 08 november 2001 22:26 schreef Xalista het volgende:
Ok, nu zijn de bugs eruit. Hier zijn mijn resultaten:

5 punten
Afstand: 130,490613243764
Duur: 00:00:00
Route: 0 3 2 1 4

(...)
Is een kortere route niet 0 4 3 2 1 0?

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 12-11-2025
Op donderdag 15 november 2001 16:28 schreef Dash2in1 het volgende:

[..]

Is een kortere route niet 0 4 3 2 1 0?
Nope, die is 146,63

Verwijderd

Kleine tip voor Dash2in1 (en anderen natuurlijk), probeer even een lusje aan je programma te maken die je kortste route op het beeldscherm zet. Wellicht had je dan meteen gezien dat je een langere route had...

  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 16:16
lijkt me wel wat voor recursief backtracken, je computer heeft zomaar een oplossing gevonden (mits je genoeg RAM hebt :) ), en rekent gewoon alle oplossingen door tot je hem stilzet. Heeft ie een betere? dan slaat ie die op en gaat ie verder. Niet zo moeilijk lijkt het op zich, maar onderschat het niet :P

Op school hebben we eens een roosterprogramma gemaakt wat dit deed met docenten, lokalen, beschikbaarheid van beiden, vakken en leerlingen. Kwam altijd wel een redelijk rooster uit, maar de eerste versies vraten óf een heleboel geheugen, óf een heleboel I/O door de SQL database die eraan hing.

Verwijderd

Op vrijdag 16 november 2001 13:15 schreef _JGC_ het volgende:
lijkt me wel wat voor recursief backtracken, je computer heeft zomaar een oplossing gevonden (mits je genoeg RAM hebt :) ), en rekent gewoon alle oplossingen door tot je hem stilzet. Heeft ie een betere? dan slaat ie die op en gaat ie verder. Niet zo moeilijk lijkt het op zich, maar onderschat het niet :P
Als je een paar pagina's terug kijkt zie je dat ik een link naar de (C++) code voor een recursieve backtracker gepost heb. Helaas is de complexiteit van dit probleem facultatief, dus je zult in principe 50! mogelijkheden moeten testen. Hoewel je de te testen mogelijkheden met een constante factor kunt beperken door branch and bound en branch and cut methodes (zitten beide in mijn code) blijft de complexiteit facultatief, en blijft het een NP probleem.

  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 15-11-2025
ok ik heb niet de hele topic gelezen maar ik ga er ff aan klooien. Ik post later op de dag wel de resultaten.

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."


  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 15-11-2025
Tja ff teveel werk te doen nog :(
i'll be back :P

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."


Verwijderd

Topicstarter
Op vrijdag 16 november 2001 13:15 schreef _JGC_ het volgende:
lijkt me wel wat voor recursief backtracken, je computer heeft zomaar een oplossing gevonden (mits je genoeg RAM hebt :) ), en rekent gewoon alle oplossingen door tot je hem stilzet. Heeft ie een betere? dan slaat ie die op en gaat ie verder. Niet zo moeilijk lijkt het op zich, maar onderschat het niet :P

Op school hebben we eens een roosterprogramma gemaakt wat dit deed met docenten, lokalen, beschikbaarheid van beiden, vakken en leerlingen. Kwam altijd wel een redelijk rooster uit, maar de eerste versies vraten óf een heleboel geheugen, óf een heleboel I/O door de SQL database die eraan hing.
Een standaard branch-and-bound (backtracken met een bound) heeft helemaal niet zoveel geheugen nodig, omdat de recursie diepte nooit hoger is dan het aantal punten waar je een route door zoekt. Natuurlijk wordt dat geheugengebruik veel hoger als je allerlei zaken over reeds bekeken routes gaat bijhouden om je algoritme sneller te maken, maar dat heeft dus niet zoveel te maken met de recursie op zich.

Ik heb het een beetje druk gehad, en heb dit probleem een beetje op een laag pitje gezet. Ik was van plan om voor dit probleem een Lin-Kernighan algoritme te implementeren, maar dat was me iets te veel moeite om het goed te krijgen. Het resultaat met lengte 305,xx voor 50 steden lijkt me vrij optimaal, maar misschien implementeer ik voor de fun nog een keer een 2-opt of 3-opt algoritme om te kijken wat die vinden. In de praktijk zou een 2 of 3-opt algoritme in een aantal runs wel het optimale resultaat moeten kunnen vinden voor 50 steden.

Voor alle brute-forcers die voor exacte resultaten gaan, ik vond dit in "Local search in Combinatorial Optimization" van Aarts, Lenstra et al.:
Over the past 15 years, the record for the largest nontrivial TSP instance solved to optimality has increased from 318 cities [Crowder & Padberg, 1980] to 2392 cities [Padberg & Rinaldi, 1987] to 7397 cities [Applegate et al., 1995]. Admittedly, this last result took 3-4 years of CPU time on a network of machines of the caliber of a SPARCstation 2. (SPARC is a trademark of SPARC International, Inc. and is licensed exclusively to Sun Microsystems, Inc.). However, the branch-and-cut technology developed for these recordsetting performances has also had a major impact on the low end of the scale. Problems with 100 or fewer cities are now routinely soved within a few minutes on a workstation (although there are isolated instances in this range that take much longer) and instances in the 1000-city range typically take only a few hours (or days); see Padberg & Rinaldi [1991], Grötschel & Holland [1991], and Applegate et al. [1995].
Er is dus nog wat ruimte voor verbetering in jullie code ;)

  • ScuL
  • Registratie: Januari 2000
  • Laatst online: 30-12-2025
fok! als je zo kan programmeren vind ik je echt sick! :P
ik programmeer al een jaar of 8 maar dit niveau kan ik dus echt niet bijbenen.. respect :7

(ben wel benieuwd naar een tekening van de snelste route :) )

ProMods ETS2 uitbreiding - Mijn tijdszone is UTC+13


Verwijderd

Op vrijdag 16 november 2001 18:44 schreef Xalista het volgende:
Er is dus nog wat ruimte voor verbetering in jullie code ;)
Hehehe, geef mij een workstation met (echte) vector processing en ik draai je die 50 steden ook binnen een paar minuten uit. :)

Ik heb trouwens wel interesse in je brute force code, ik zou met name graag willen zien hoe jij je bounding implementeert (volgens mij bound ik op eoa. manier nog steeds te laat).

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 11-12-2025
Op vrijdag 16 november 2001 08:50 schreef Debbus het volgende:
Kleine tip voor Dash2in1 (en anderen natuurlijk), probeer even een lusje aan je programma te maken die je kortste route op het beeldscherm zet. Wellicht had je dan meteen gezien dat je een langere route had...
Uh, had ik ook hoor, maar er zat een foutje in me programma, waardoor de laatste waarde 2 keer werd geteld en bovendien had ik het verkeerd getypt.. bedoelde 041230, maar dat is natuurlijk hetzelfde als 032140. Achteraf behoorlijk stompzinnig van me.

Verwijderd

Topicstarter
Op vrijdag 16 november 2001 21:10 schreef mietje het volgende:

[..]

Hehehe, geef mij een workstation met (echte) vector processing en ik draai je die 50 steden ook binnen een paar minuten uit. :)
Vector processors? Die zitten volgens mij alleen in Cray supercomputers, niet in workstations...
Ik heb trouwens wel interesse in je brute force code, ik zou met name graag willen zien hoe jij je bounding implementeert (volgens mij bound ik op eoa. manier nog steeds te laat).
Mijn code? Joh, die is echt zo basic al wat... Het is niet voor niks dat die van jouw véél sneller is. Maar, voor de record, ik bound als de lengte van het stuk route waar ik op dat moment naar kijk + de lengte van de terugreis langer is dan de beste route tot dan toe. Verder niks.

BTW. Wat is het verschil tussen branch-and-bound en branch-and-cut?

Verwijderd

Op zaterdag 17 november 2001 11:44 schreef Xalista het volgende:
Mijn code? Joh, die is echt zo basic al wat... Het is niet voor niks dat die van jouw véél sneller is. Maar, voor de record, ik bound als de lengte van het stuk route waar ik op dat moment naar kijk + de lengte van de terugreis langer is dan de beste route tot dan toe. Verder niks.
Mja, het gaat mij dus om "+ de lengte van de terugreis". Als ik dat java-appletje bekijk voel ik gewoon aan m'n water dat er eerder te bounden moet zijn ;)
BTW. Wat is het verschil tussen branch-and-bound en branch-and-cut?
Cut algoritmes werken niet door een bepaalde grens (de bound) te naderen en te backtracken als die grens overschreden wordt, maar nemen andere criteria die niet stap voor stap een grens naderen om de recursieboom te beperken (bv. mijn criterium dat er geen paden mogen kruisen).

  • MIster X
  • Registratie: November 2001
  • Laatst online: 11-12-2025
Zeg, ik heb hier de afgelopen dagen ook een beetje naar lopen kijken. Erg interessant...
Hoe ver zijn jullie op dit moment?

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 11-12-2025
Op dinsdag 13 november 2001 00:23 schreef DiFool het volgende:
Plaatje, lengte 305,28, alleen begin is anders:

[afbeelding]
Hmm, noem me lui, maar welke punten heb je dan concreet .. is nogal onduidelijk op te maken?

Verwijderd

Op dinsdag 20 november 2001 16:26 schreef Dash2in1 het volgende:

[..]

Hmm, noem me lui, maar welke punten heb je dan concreet .. is nogal onduidelijk op te maken?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
13, 11 - 46
06, 05 - 0
04, 06 - 38
01, 09 - 25
05, 23 - 26
05, 26 - 11
02, 32 - 4
01, 34 - 40
02, 46 - 19
11, 39 - 43
15, 30 - 41
13, 29 - 7
12, 24 - 12
18, 27 - 23
22, 34 - 8
24, 37 - 30
19, 39 - 27
18, 41 - 9
18, 45 - 13
23, 44 - 21
23, 49 - 10
30, 50 - 28
43, 48 - 29
34, 40 - 39
39, 37 - 37
45, 36 - 22
44, 33 - 15
48, 31 - 34
49, 30 - 1
42, 23 - 2
37, 26 - 18
30, 32 - 24
31, 26 - 32
27, 24 - 35
29, 19 - 44
35, 22 - 49
36, 20 - 5
35, 19 - 6
36, 15 - 42
46, 12 - 33
50, 08 - 16
40, 10 - 31
36, 07 - 48
35, 08 - 20
31, 10 - 17
33, 06 - 3
36, 03 - 36
30, 00 - 47
25, 03 - 45
21, 03 - 14

  • htca
  • Registratie: November 2001
  • Laatst online: 31-12-2025
Ik kwam van de week mijn code tegen die ik hiervoor had geschreven. Zijn er mensen die hier nog steeds aan werken?
Pagina: 1 2 Laatste