2011-11-29 9 views
9

मैंने इसी तरह के प्रश्नों को देखा है लेकिन मेरी समस्या से संबंधित कुछ भी नहीं मिल रहा है। मैंप्रोलॉग में सरलीकृत ट्रैवलिंग सेल्समैन

distance(City1,City2,Distance) 

तथ्यों के एक डेटाबेस का उपयोग कर एक एल्गोरिथ्म या 'छोरों' कि CityA से CityB करने के लिए एक रास्ता मिल जाएगा के सेट को खोजने के लिए संघर्ष कर रहा हूँ,। जो मैंने अभी तक करने में कामयाब रहा है वह नीचे है, लेकिन यह हमेशा write(X), पर बैकट्रैक करता है और फिर अंतिम पुनरावृत्ति के साथ पूरा करता है, जो मैं चाहता हूं कि वह केवल कुछ हद तक हो।

उदाहरण के लिए, मैं नहीं चाहता कि यह किसी भी शहर के नामों को मुद्रित करें, जो अंतिम सिरे हैं, या अंतिम पुनरावृत्ति का उपयोग करें। मैं मूल रूप से CityA से CityB तक पथ बनाना चाहता हूं, जो पथ पर जाने वाले शहरों का नाम लिख रहा है।

मुझे उम्मीद है कि कोई मेरी मदद कर सकता है!

all_possible_paths(CityA, CityB) :- 
    write(CityA), 
    nl, 
    loop_process(CityA, CityB). 

loop_process(CityA, CityB) :- 
    CityA == CityB. 
loop_process(CityA, CityB) :- 
    CityA \== CityB, 
    distance(CityA, X, _), 
    write(X), 
    nl, 
    loop_process(X, CityB). 

उत्तर

7

मैंने यह दिखाने की कोशिश की कि आप किस काम पर काम कर रहे हैं ताकि आप यह समझ सकें कि यह कैसे काम करता है। तो चूंकि आपका ओपी बहुत पूरा नहीं था, इसलिए मैंने कुछ स्वतंत्रता ली!

road(birmingham,bristol, 9). 
road(london,birmingham, 3). 
road(london,bristol, 6). 
road(london,plymouth, 5). 
road(plymouth,london, 5). 
road(portsmouth,london, 4). 
road(portsmouth,plymouth, 8). 

यहाँ विधेय हम अपने पथ, get_road/4 खोजने के लिए फोन करेगा है: यहाँ तथ्यों के साथ मैं काम कर रहा हूँ कर रहे हैं। यह मूल रूप से कामकाजी भविष्यवाणी कहता है, जिसमें दो accumulators (पहले से देखे गए बिंदुओं के लिए एक और एक दूरी के लिए हम एक के माध्यम से) है। (प्रारंभ, + End, + वेपाइंट, + DistanceAcc, -Visited, -TotalDistance +) get_road:

get_road(Start, End, Visited, Result) :- 
    get_road(Start, End, [Start], 0, Visited, Result). 

यहाँ काम कर रहे विधेय, है
get_road/6
पहले खंड बताता है कि अगर हमारे पहले बिंदु और हमारे अंतिम बिंदु के बीच एक सड़क है, हम यहां समाप्त कर सकते हैं।

get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :- 
    road(Start, End, Distance), 
    reverse([End|Waypoints], Visited), 
    TotalDistance is DistanceAcc + Distance. 

दूसरा खंड बताता है कि अगर वहाँ हमारी पहली बिंदु और एक मध्यवर्ती बिंदु के बीच एक सड़क है, तो हम इसे ले और फिर get_road (मध्यवर्ती, अंत) हल कर सकते हैं।

?- get_road(portsmouth, plymouth, Visited, Distance). 

और पैदावार:

Visited = [portsmouth, plymouth], 
Distance = 8 ; 
Visited = [portsmouth, london, plymouth], 
Distance = 9 ; 
Visited = [portsmouth, plymouth, london, plymouth], 
Distance = 18 ; 
false. 

मुझे आशा है कि यह आपके लिए उपयोगी साबित होगा

get_road(Start, End, Waypoints, DistanceAcc, Visited, TotalDistance) :- 
    road(Start, Waypoint, Distance), 
    \+ member(Waypoint, Waypoints), 
    NewDistanceAcc is DistanceAcc + Distance, 
    get_road(Waypoint, End, [Waypoint|Waypoints], NewDistanceAcc, Visited, TotalDistance). 

प्रयोग इस प्रकार है।

+0

आप महोदय, कर्तव्य की कॉल के ऊपर और परे चले गए हैं! यह अविश्वसनीय है, यह सही है और यह वास्तव में समझ में आता है! क्षमा करें मैं इतनी डमी हूं, मैं वास्तव में प्रोलॉग के लिए नया हूं और इसमें काफी हद तक स्वाभाविक रूप से आया है, मैंने वास्तव में इस कार्य के साथ संघर्ष किया है। बहुत बहुत धन्यवाद, इसलिए बहुत अधिक:] –

+0

यदि आप इस कोड को समझने के लिए फिर से संघर्ष करते हैं तो मैं और प्रश्न पोस्ट करने में संकोच नहीं करता हूं, मैं या अन्य टिप्पणियों में उनका उत्तर देंगे :) – m09

1

आपको all_possible_paths में आउट चर के रूप में एक सफल सूची वापस करनी चाहिए। फिर उस सूची को लिखें। एक ही प्रक्रिया में दोनों मत करो।

+0

आपकी मदद के लिए धन्यवाद:] –

4

अशुद्ध से शुद्ध हिस्सा अलग करें (आई/ओ, write/1, nl/0 लेकिन यह भी (==)/2 और (\==)/2 की तरह)। जब तक वे पूरी तरह से आपके शुद्ध कोड से जुड़े हुए हैं, आप अधिक उम्मीद नहीं कर सकते हैं।

शायद आप एक शुरुआती बिंदु, एक अंत बिंदु और बीच के बीच एक संबंध चाहते हैं।

क्या यह पथ विश्वकोश होना चाहिए या क्या आप चक्र पर अनुमति देते हैं?

यह सुनिश्चित करें कि एक तत्व X एक सूची Xs में नहीं होती लक्ष्य maplist(dif(X),Xs). का उपयोग आप इस एक अच्छा संबंध बनाने के लिए किसी भी आगे की सहायक विधेय जरूरत नहीं है!

+0

एक बार शहर का उपयोग करने के बाद, इसका उपयोग उसी मार्ग में फिर से नहीं किया जा सकता है। तो, विश्वकोश। शुद्ध और अशुद्ध द्वारा आपका क्या मतलब है? –

+0

मैंने ऊपर एक स्पष्टीकरण जोड़ा। – false

+0

आपकी मदद के लिए धन्यवाद! :] –

संबंधित मुद्दे