Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Mathi
Artikelen: 0
Berichten: 3
Lid geworden op: za 05 okt 2013, 18:04

Re: Handelsreizigersprobleem

Ik moet zeggen dat ik je document nog niet helemaal begrijp, maar wellicht heb je toch wel wat aan mijn commentaar.

Normaal is het startpunt van een algoritme tav een TSP (traveling salesman problem) een matrix met (directe) afstanden. In deze matrix geldt de zogenaamde driehoeksongelijkheid: als we zeggen dat
\(d(x,y)\)
de afstand van stad x tot stad y is, dan geldt dat
\(d(x,y) \leq d(x,z) + d(z,y) \)
voor alle steden x, y en z. Hierdoor weet je altijd dat de afstanden in de matrix altijd de kortste afstanden zijn, waardoor je geen Dijkstra hoeft te gebruiken in je matrix. Ik zou zeggen dat je dit als redelijk startpunt kan gebruiken voor een algoritme: zo'n matrix creeren is namelijk redelijk triviaal (door middel van Dijkstra).

In jouw verhaal lijk je te suggereren alsof er geen (exacte) oplosmethoden voor een TSP zijn, behalve alle combinaties uitproberen. Dit is pertinent niet waar: bijvoorbeeld met behulp van branch&bound kan je redelijk makkelijk met de hand een TSP van 5 steden oplossen. Alleen voor hele grote matrices gaat dit mis, want dan doe je er heel lang over, maar wel veel minder lang dan de brute-force oplossing.

Maar goed, nu jouw algoritme. Ik begrijp hem nog niet helemaal (ook door gebrek aan wiskundige notatie), maar als ik het goed begrijp maak je eerst een optimale oplossing die alle steden verbindt (maar uit verschillende routes) bestaat, om vervolgens deze routes op de beste manier aan elkaar te verbinden. Dit is dezelfde methode als de branch&cut methode, wat geldt als een van de beste manieren om een TSP op te lossen. Hij is alleen nog steeds niet zo efficient dat het in polynomiale tijd oplosbaar is.

Als ik je complexiteitsberekeningen zie, heb ik geen vertrouwen in de correctheid daarvan. Ik weet daar zelf te weinig van af om het zelf uit te rekenen, maar ik zie wel dat je veel vergeet: operaties als sorteren en het minimum uitrekenen heb je helemaal niet meegenomen terwijl deze juist veel rekentijd in beslag nemen. Als je bijvoorbeeld het minimum van een (ongesorteerde) verzameling getallen laat uitrekenen door een computer, moet je namelijk alle getallen af en elk getal vergelijken enz. De beste manier om de complexiteit te berekenen is het algoritme programmeren en dan een computer het laten berekenen. Nu slaat het eigenlijk weinig op wat je zegt.

Bovendien wil ik eigenlijk ook meegeven dat dit soort grote stellingen in de wiskunde niet op dit niveau worden opgelost. Je kunt dit ook vergelijken met de Laatste Stelling van Fermat (er zijn geen geheeltallige x, y en z waarvoor geldt dat
\(x^n + y^n = z^n\)
voor
\(n \geq 3 \)
). Er hebben mensen jaren verspild aan het proberen van getallen om te bewijzen dat de stelling niet klopte. Uiteindelijk is het pas na honderden jaren bewezen door middel van heel geavanceerde wiskunde bewezen dat de stelling juist was. Ook met het handelsreizigersprobleem zijn er al heel lang heel veel mensen bezig. No offense, maar het is erg naief om te denken dat zo'n groot probleem als P=NP kan worden opgelost door een simpel algoritmetje. Natuurlijk, het is mogelijk dat je aan iets denkt waar nog niemand aan heeft gedacht, maar dat is zeer onwaarschijnlijk, zeker voor iemand die niet zo wiskundig vaardig is.
Gebruikersavatar
Esthetisch
Artikelen: 0
Berichten: 113
Lid geworden op: vr 19 jul 2013, 13:06

Re: Handelsreizigersprobleem

Normaal is het startpunt van een algoritme tav een TSP (traveling salesman problem) een matrix met (directe) afstanden. In deze matrix geldt de zogenaamde driehoeksongelijkheid: als we zeggen dat 

de afstand van stad x tot stad y is, dan geldt dat ………………..

voor alle steden x, y en z. Hierdoor weet je altijd dat de afstanden in de matrix altijd de kortste afstanden zijn, waardoor je geen Dijkstra hoeft te gebruiken in je matrix. Ik zou zeggen dat je dit als redelijk startpunt kan gebruiken voor een algoritme: zo'n matrix creeren is namelijk redelijk triviaal (door middel van Dijkstra).
zie bericht #71 de eerste quote.

Bovendien gaat de driehoeksvergelijking in ieder geval bij mijn versie sowieso al niet op. Misschien dat het voorbeeld de suggestie wekt dat de situatie natuurgetrouw moet zijn, maar het hoeft niet zo te zijn dat de verbinding tussen 2 punten een rechte lijn is. Het kan best gebeuren dat de afstand of reistijd tussen 2 steden bij een directe verbinding langer is dan met een viavia-weggetje.

In jouw verhaal lijk je te suggereren alsof er geen (exacte) oplosmethoden voor een TSP zijn, behalve alle combinaties uitproberen. Dit is pertinent niet waar: bijvoorbeeld met behulp van branch&bound kan je redelijk makkelijk met de hand een TSP van 5 steden oplossen. Alleen voor hele grote matrices gaat dit mis, want dan doe je er heel lang over, maar wel veel minder lang dan de brute-force oplossing.
Okay misschien is brute kracht inderdaad niet de allersnelste bekende manier. Bedankt voor de toevoeging.
Maar goed, nu jouw algoritme. Ik begrijp hem nog niet helemaal (ook door gebrek aan wiskundige notatie), maar als ik het goed begrijp maak je eerst een optimale oplossing die alle steden verbindt (maar uit verschillende routes) bestaat, om vervolgens deze routes op de beste manier aan elkaar te verbinden. Dit is dezelfde methode als de branch&cut methode, wat geldt als een van de beste manieren om een TSP op te lossen. Hij is alleen nog steeds niet zo efficient dat het in polynomiale tijd oplosbaar is.
Het is niet zo dat je 2 routes verbindt. Je vormt twee nieuwe routes om tot 1 nieuwe route. De 2 oorspronkelijke routes kunnen hierbij vrijwel helemaal verdwijnen en transformeren naar een totaal andere nieuwe route. Dit is dus behoorlijk anders dan die branch&cut methode. Zie ook bericht #55
Als ik je complexiteitsberekeningen zie, heb ik geen vertrouwen in de correctheid daarvan. Ik weet daar zelf te weinig van af om het zelf uit te rekenen, maar ik zie wel dat je veel vergeet: operaties als sorteren en het minimum uitrekenen heb je helemaal niet meegenomen terwijl deze juist veel rekentijd in beslag nemen. Als je bijvoorbeeld het minimum van een (ongesorteerde) verzameling getallen laat uitrekenen door een computer, moet je namelijk alle getallen af en elk getal vergelijken enz. De beste manier om de complexiteit te berekenen is het algoritme programmeren en dan een computer het laten berekenen. Nu slaat het eigenlijk weinig op wat je zegt.
Ik heb in het document zelf ook aangegeven dat de snelheidberekening niet 100% correct zal zijn en dergelijke schoonheidsfoutjes kan bevatten. Dat soort foutjes maken echter niet een noemenswaardig verschil in snelheid, je moet maximaal alles nog eens een paar keer met n vermenigvuldigen. Daaruit komt een vermeerdering van machten naar voren, maar geen verwisseling van n en x (dus van n^x naar x^n). Ik hoop toch dat je dat zelf ook wel inziet. Die verwisseling vindt alleen plaats bij het gebruiken van BellmanFord(ipv Dijkstra), maar die verwisseling daar pakt juist gunstig uit, dankzij die verwisseling is het hele probleem namelijk in polynomiale tijd op te lossen. Dat is de hele essentie van het stuk. Wat dat betreft is de oplossing voor P=NP ook veel meer aan Dijkstra te danken dan aan mij.

Bij het berekenen van Dijkstra’s snelheid wordt dat sorteren / laagste bepalen volgens mij overigens ook helemaal niet genoemd of meegenomen, dus ik vraag me af in hoeverre dat nu echt zo noodzakelijk is. Inclusief laagste bepalen kost Dijkstra geen n^2 maar 2n^2.

En die geprogrammeerde code is zo goed als af. (het uiteindelijke algoritme, vooral stap 3, is nog iets verbeterd tov het document). Ondertussen heb ik ook maar contact gezocht met Acta Mathematica want die hoogleraren van de TU laten ook niets van zich horen, binnenkort moet daar duidelijkheid over zijn. Wanneer ik die excelmacro naar hun stuur (dat doe ik indien ze daar genoeg aan hebben) zet ik hem denk ik niet meer direct ook hier op dit forum. Anders wel natuurlijk. Verduidelijking is wel mogelijk, ik ben altijd bereid die te geven. Voorbeelden ook. Maar voor een pure knippen-plakken-omschrijving zul je nog eventjes geduld moeten hebben. Of je zult hem zelf moeten maken.
Destruction has an end. Creation doesn't.
Gebruikersavatar
Math-E-Mad-X
Artikelen: 0
Berichten: 2.907
Lid geworden op: wo 13 sep 2006, 17:31

Re: Handelsreizigersprobleem

Esthetisch schreef: ma 07 okt 2013, 11:54
Bovendien gaat de driehoeksvergelijking in ieder geval bij mijn versie sowieso al niet op. Misschien dat het voorbeeld de suggestie wekt dat de situatie natuurgetrouw moet zijn, maar het hoeft niet zo te zijn dat de verbinding tussen 2 punten een rechte lijn is. Het kan best gebeuren dat de afstand of reistijd tussen 2 steden bij een directe verbinding langer is dan met een viavia-weggetje.
Wat hij bedoelt te zeggen is dat ieder TSP probleem equivalent is aan een probleem waarbij de driehoeksvergelijking wel geldig is. Je mag dus gewoon altijd aannemen dat de afstand tussen 2 steden WEL altijd een directe verbinding is, zelfs al is dat niet het geval voor de originele formulering van het probleem. Door die aanname te maken maak je het probleem gelijk een stuk eenvoudiger.

Dit heb ik je overigens al uitgelegd in bericht nummer #69
Esthetisch schreef: ma 07 okt 2013, 11:54
zie bericht #71 de eerste quote.
Je hebt inderdaad al meerdere keren duidelijk gemaakt dat je Dijkstra of Bellman-Ford niet gebruikt om de kortste afstanden uit te rekenen. Dat hier blijkbaar nog steeds een misverstand over bestaat komt waarschijnlijk omdat je nog niet duidelijk uitgelegd hebt waar je dat Bellman-Ford dan eigenlijk wel voor gebruikt. Dit is ook mij nog steeds volkomen onduidelijk.
while(true){ Thread.sleep(60*1000/180); bang_bassdrum(); }
Gebruikersavatar
Math-E-Mad-X
Artikelen: 0
Berichten: 2.907
Lid geworden op: wo 13 sep 2006, 17:31

Re: Handelsreizigersprobleem

Esthetisch schreef: ma 07 okt 2013, 11:54
En die geprogrammeerde code is zo goed als af. (het uiteindelijke algoritme, vooral stap 3, is nog iets verbeterd tov het document). Ondertussen heb ik ook maar contact gezocht met Acta Mathematica want die hoogleraren van de TU laten ook niets van zich horen, binnenkort moet daar duidelijkheid over zijn. Wanneer ik die excelmacro naar hun stuur (dat doe ik indien ze daar genoeg aan hebben) zet ik hem denk ik niet meer direct ook hier op dit forum.
Ik zou heel voorzichtig zijn met het benaderen van hoogleraren of wetenschappelijke tijdschriften. Je kunt beter je algoritme eerst eens testen op de voorbeelden uit post #27. Als je algoritme niet goed blijkt te werken maak je je zelf alleen maar belachelijk bij de hoogleraren en is de kans dat ze in de toekomst nog naar je zullen luisteren nihil. Zelfs als je oorspronkelijke idee goed was.

Bovendien, als de mensen hier op dit forum grote moeite hebben met het begrijpen van je algoritme, dan zal dat niet anders zijn met de hoogleraren die waarschijnlijk nog veel minder geduld zullen hebben. Je kunt dus beter eerst moeite steken in het verbeteren van je uitleg voordat je deze aan de hoogleraren voorlegt. Opnieuw omdat ze anders in de toekomst helemaal niet meer naar je zullen luisteren.
while(true){ Thread.sleep(60*1000/180); bang_bassdrum(); }
Gebruikersavatar
Drieske
Artikelen: 0
Berichten: 10.179
Lid geworden op: za 12 jul 2008, 17:07

Re: Handelsreizigersprobleem

Opmerking moderator

Na moderatoroverleg hebben we de off-topic reacties (of stukken van een reactie) verwijderd en dit topic heropend. Laten we ons nu terug concentreren op de inhoud van het topic zelf. Eventuele toekomstige off-topic reacties zullen verwijderd worden.
Zoek je graag naar het meest interessante wetenschapsnieuws? Wij zoeken nog een vrijwilliger voor ons nieuwspostteam.
Gebruikersavatar
Esthetisch
Artikelen: 0
Berichten: 113
Lid geworden op: vr 19 jul 2013, 13:06

Re: Handelsreizigersprobleem


Wat hij bedoelt te zeggen is dat ieder TSP probleem equivalent is aan een probleem waarbij de driehoeksvergelijking wel geldig is. Je mag dus gewoon altijd aannemen dat de afstand tussen 2 steden WEL altijd een directe verbinding is, zelfs al is dat niet het geval voor de originele formulering van het probleem. Door die aanname te maken maak je het probleem gelijk een stuk eenvoudiger.

Dit heb ik je overigens al uitgelegd in bericht nummer #69
Okay, maar dan nog blijft de verwijzing naar #71 gewoon van toepassing. Ik probeerde alleen maar aan te geven dat die driehoeksvergelijking voor het vinden van een oplossing helemaal niet noodzakelijk is. Ook voor situaties waar de driehoeksvergelijking niet geldt hoort het algoritme nog steeds gewoon de juiste oplossing te geven.

Je hebt inderdaad al meerdere keren duidelijk gemaakt dat je Dijkstra of Bellman-Ford niet gebruikt om de kortste afstanden uit te rekenen. Dat hier blijkbaar nog steeds een misverstand over bestaat komt waarschijnlijk omdat je nog niet duidelijk uitgelegd hebt waar je dat Bellman-Ford dan eigenlijk wel voor gebruikt. Dit is ook mij nog steeds volkomen onduidelijk.
Je gebruikt dat Bellman-Ford om de meest efficiente bewerking met (2)rijen te bepalen, maar waarschijnlijk vraag je je vooral af op welke manier je dat dan precies doet. Hopelijk helpt dit:

Afbeelding

Hoe je Dijkstra uitvoert op de verkregen tabel is hier te vinden:



Het algoritme van Bellman-Ford op zo’n tabel heb ik geen voorbeeld van, maar op internet zijn genoeg ‘codes’ te vinden voor hoe het bellman-ford in zijn algemeenheid werkt.

Misschien zeg je nu dat ik bovenstaande plaatje wel wat eerder had mogen plaatsen, daar kan ik best inkomen, maar ik had me nog niet beseft dat het zo simpel valt weer te geven. Soms dan duren dat soort dingen even.
Destruction has an end. Creation doesn't.
Gebruikersavatar
Math-E-Mad-X
Artikelen: 0
Berichten: 2.907
Lid geworden op: wo 13 sep 2006, 17:31

Re: Handelsreizigersprobleem

Esthetisch schreef: do 10 okt 2013, 09:59
Je gebruikt dat Bellman-Ford om de meest efficiente bewerking met (2)rijen te bepalen
Hier snap ik dus helemaal niets van. over welke bewerking heb je het hier? Het Bellman-Ford algoritme is een bewerking, waarmee je (normaal gesproken) de kortste weg tussen twee steden bepaalt.

Ik snap echt niet hoe je een bewerking kunt bepalen met een algoritme (of wat dat überhaupt betekent: het "bepalen van een bewerking")

En dat plaatje dat je toegevoegd hebt maakt bij mij ook niets duidelijker. Wat betekenen de pijlen? Wat betekenen de kleuren die je aan de pijlen hebt gegeven? Zit er een chronologische volgorde tussen de pijlen?

Het probleem is dat je telkens de dingen veel te vlug probeert uit te leggen. Met één enkel plaatje, of een paar zinnen. Je zult echt alles veel uitgebreider moeten uitleggen. Liever te veel details dan te weinig.
while(true){ Thread.sleep(60*1000/180); bang_bassdrum(); }
Gebruikersavatar
Esthetisch
Artikelen: 0
Berichten: 113
Lid geworden op: vr 19 jul 2013, 13:06

Re: Handelsreizigersprobleem


Hier snap ik dus helemaal niets van. over welke bewerking heb je het hier? Het Bellman-Ford algoritme is een bewerking, waarmee je (normaal gesproken) de kortste weg tussen twee steden bepaalt.

Ik snap echt niet hoe je een bewerking kunt bepalen met een algoritme (of wat dat überhaupt betekent: het "bepalen van een bewerking")
Hier bepaal je dus niet de kortste weg tussen 2 steden, maar de 'laagste bijkomende afstand' agv het selecteren van een andere lijn bij een bepaalde stad. (((Je neemt nu dus niet de afstanden als invalshoek, maar bepaalde steden. Bij (de berekeningen met) de normale tabel beschouw je de situatie als een hele hoop punten bij een aantal lijnen. Bij (de berekeningen met) de dijkstra tabel beschouw je de situatie als een hele hoop lijnen bij een aantal punten. Daarvoor is dan wel een zekere 'convertering' nodig.)))

Wat je bij het omwerken van de tabel feitelijk doet is dat je de situatie zoals die op een bepaald moment is als uitgangspunt neemt, en dus eigenlijk op 0 stelt. De waarde van iedere 'geselecteerde lijn' (gevuld vakje) zie je als 0 (toch blijven het wel degelijk 2 punten aan 1 lijn). Vervolgens druk je alle 'niet geselecteerde lijnen' die bij dat punt horen uit als het verschil met die oorspronkelijke lijn. En met die verschillen voer je bellmanford uit. De kortste weg tussen 2 punten (zoals die bij Bellmanford zou zijn) staat dan dus eigenlijk gelijk aan de 'verandering van vakjes' met het laagste verschil t.o.v. de oorspronkelijke situatie. Die verandering is nodig om zowel een plaats vrij te maken voor een vakje uit de (>2)rijen als om een gevuld vakje vrij te maken voor de (kleiner2)rijen.

Met het bepalen van een bewerking bedoelde ik het berekenen van de waarde die bij een bepaalde bewerking (=verplaatsing van 1 of meer gevulde vakjes) hoort. Die waarde staat dus voor de bijkomende afstand. Met het bepalen van de laagste bewerking bedoel ik dus dat je alle mogelijke bewerkingen berekent en vervolgens de laagste neemt. Die laagste bewerking kan je dan vervolgens ook daadwerkelijk uitvoeren.

Even terzijde: Misschien zou je het bellmanfordalgoritme ook wel uit kunnen voeren voor steeds elke (>2)rij naar elke (kleiner2)rij, telkens in combinatie met alle (2)rijen, maar daar durf ik niet zomaar van uit te gaan, misschien is het een mogelijke optimalisatie. Laten we daar nu niet verder op ingaan.

En dat plaatje dat je toegevoegd hebt maakt bij mij ook niets duidelijker. Wat betekenen de pijlen? Wat betekenen de kleuren die je aan de pijlen hebt gegeven? Zit er een chronologische volgorde tussen de pijlen?
Nee er zit geen chronologische volgorde in. De kleuren geven aan dat ze bij 1 bepaald vakje uit de dijkstratabel(D) horen. Om de waarde van zo'n vakje(rijD,kolomD) in de dijkstratabel te bepalen moet je dus in de normaletabel ( C ) voor beide vakjes in een rij ( C ) de waarde van het gevulde vakje(rijC=kolomD) aftrekken van de waarde in het lege vakje(rijC=rijD). Althans wanneer dat mogelijk is. De laagste van de twee verkregen waardes vul je in in je vakje (rijD,kolomD) in de dijkstratabel.

Ter info: de C en D zijn hier dus puur bedoeld om de betreffende tabel aan te geven, ze zeggen niets over welke specifieke kolom of rij je binnen zo'n tabel hebt, alleen of je überhaupt uitgaat van de rij, of van de kolom.
Destruction has an end. Creation doesn't.
Gebruikersavatar
Esthetisch
Artikelen: 0
Berichten: 113
Lid geworden op: vr 19 jul 2013, 13:06

Re: Handelsreizigersprobleem

Beste allen,

Ik ben even bezig geweest om stap 1 en 2 in een definitief en wat formeler vat te gieten, dit is Algoritme 1 geworden. Het algoritme 1 is langzamer dan de oorspronkelijke stap 1 en 2 doordat ik het nog verder vereenvoudigd heb, de opzet is geweest het in zo min mogelijk worden toch zo volledig mogelijk te omschrijven, en het dus zo compact en uniform mogelijk te houden. Het is dus niet de efficiëntste manier van uitvoering van het algoritme, maar wel de meest efficiente manier om het te beschrijven. Ik hoop toch dat dit algoritme 1 nu wel door iedereen moet uit zijn te voeren.

Dus bij deze Algoritme 1. Het geeft voor een beginsituatie met steden en hun onderlinge afstanden de kortste (combinatie van) route(s), waarbij dus geldt dat ELK punt met precies 2 andere punten verbonden is. Bij bepaalde gevallen kan met algoritme 1 het handelsreizigersprobleem worden opgelost, maar dit hoeft niet altijd zo te zijn. Wanneer je na Algoritme 1 slechts 1 route hebt ben je klaar, zo niet, dan moet Algoritme 2 (=stap 3) uit gaan voeren.

Dat algoritme 2 ga ik me nu op concenteren. Algoritme 1 klopt 100%, dat weet ik zeker, of het moet een schrijffout zijn. In dat geval hoor ik het graag. Nu is het zaak voor mij om algoritme 2 in een definitief en zelfde vat te gieten.

Die macro neemt wat meer tijd in beslag dan verwacht omdat kleine wijzigingen soms desastreuze gevolgen hebben, maar ook dit komt zeker goed op termijn.
Bijlagen
Algoritme 1
(12.34 KiB) 347 keer gedownload
Destruction has an end. Creation doesn't.

Terug naar “Wiskunde”