ট্র্যাভেলিং সেলসম্যান


17

আপনাকে একটি তালিকা বা ভেক্টর হিসাবে বা যাই হোক না কেন, 3 টি-টিপলস বা যা কিছু হোক না কেন, যেখানে প্রথম দুটি জিনিস স্ট্রিং, এবং তৃতীয় জিনিসটি একটি সংখ্যা। স্ট্রিংগুলি শহরগুলি এবং সংখ্যাটি তাদের মধ্যে দূরত্ব। টিপলগুলিতে নগরগুলির ক্রমটি স্বেচ্ছাসেবক (অর্থাত্ প্রথমে যেটি আসে এবং দ্বিতীয়টি আসে তা বিবেচনা করে না) যেহেতু এটি প্রতিটি পথের সমান দূরত্ব। এছাড়াও, সংযুক্ত উদ্ধৃতিগুলির প্রতিটি জুটির জন্য ঠিক একটি টিপল রয়েছে। সমস্ত শহর সংযুক্ত নাও হতে পারে। এছাড়াও, দূরত্ব সর্বদা ইতিবাচক থাকে (না0)। আপনার এই শর্তগুলি পরীক্ষা করার দরকার নেই, আপনি ধরে নিতে পারেন ইনপুটটি ভালভাবে গঠন করা হবে। আপনার কাজ হ'ল শহরগুলিকে একটি চক্রাকার ক্রমে ফিরিয়ে দেওয়া, যেমন আপনি যদি কোনও একটি শহরে শুরু করেন এবং সিকোয়েন্সটি একই শহরে ফিরে যান তবে শহরগুলির মধ্যে মোট দূরত্ব সর্বনিম্ন হবে (ঠিক এবং সমস্ত ক্ষেত্রে) কেস।) আপনি ধরে নিতে পারেন কোনও সমাধান রয়েছে। উদাহরণস্বরূপ, আমাদের বলুন আপনাকে দেওয়া হয়েছে

[("New York", "Detroit", 2.2), ("New York", "Dillsburg", 3.7), ("Hong Kong", "Dillsburg", 4), ("Hong Kong", "Detroit", 4), ("Dillsburg", "Detroit", 9000.1), ("New York", "Hong Kong", 9000.01)]

আপনি নিম্নলিখিতগুলির যে কোনও আউটপুট করতে পারেন (তবে আপনার কেবলমাত্র একটি আউটপুট প্রয়োজন):

["Detroit","Hong Kong","Dillsburg","New York"]
["Hong Kong","Dillsburg","New York","Detroit"]
["Dillsburg","New York","Detroit","Hong Kong"]
["New York","Detroit","Hong Kong","Dillsburg"]
["Dillsburg","Hong Kong","Detroit","New York"]
["New York","Dillsburg","Hong Kong","Detroit"]
["Detroit","New York","Dillsburg","Hong Kong"]
["Hong Kong","Detroit","New York","Dillsburg"]

কারণ এটি সবচেয়ে সংক্ষিপ্ত ট্রিপ: ১৩.৯

কিন্তু না

["Dillburg","Detroit","New York","Hong Kong"]

কারণ এটি সবচেয়ে ছোট নয়।

En.wikedia.org/wiki/Travelling_salesman_problem দেখুন

স্কোরিং

যেখানে সেটা আকর্ষণীয় হয়। আপনার কাছে থাকা অক্ষরের সংখ্যা আপনি নিয়ে যান এবং তারপরে এগুলি সবচেয়ে খারাপ ক্ষেত্রে ও-স্বাক্ষর সূত্রে প্লাগ করুন into উদাহরণস্বরূপ, আসুন আমরা আপনাকে বলি যে আপনি একটি ব্রুট ফোর্স প্রোগ্রাম লিখুন যা 42 টি অক্ষর। যেমনটি আমরা সবাই জানি, সবচেয়ে খারাপ পরিস্থিতি হ'ল শহরগুলির সংখ্যা n!কোথায় n। 42! = 1405006117752879898543142606244511569936384000000000, যাতে এটি আপনার স্কোর। সর্বনিম্ন স্কোর জয়ী

দ্রষ্টব্য: আমি এটি পরেও স্বস্তি পেয়েছি, তবে কীভাবে এটি সমাধান করবেন তা সম্পর্কে নিশ্চিত ছিলাম না এবং আশা ছিল যে কারও নজরে আসবে না। লোকেরা করেছে, তাই আমি ইস্যাকের পরামর্শ নিয়ে যাব:

কেবলমাত্র বিকল্পগুলি হ'ল হে (এন!) এবং ও (বি ^ এন এন ^ লএন (এন) ^ কে), এবং সমস্ত সীমা অবশ্যই যথাসম্ভব কঠোর হওয়া উচিত


4
কিন্তু কিভাবে আপনি বলে কেউ এর কোড হল O(n!)কিন্তু না O(sqrt(n)*n^n/e^n)কিংবা O(n!/100000000000000000000)?
jimmy23013

1
@ user23013 ওয়ান সমাধান শুধুমাত্র অপশন আছে বলতে হয় O(n!)এবং O(b^n*n^a*ln(n)^k), এবং সমস্ত সীমা যে স্বরলিপি দেওয়া সম্ভব আঁট যেমন হতে হবে। যদিও ওপি স্পষ্ট করা উচিত।
isaacg

2
@ জিওবিটস কমিকটিতে প্রদর্শিত হিসাবে, গতিশীল প্রোগ্রামিং সমাধানটি O(n^2*2^n), যা O(n!)বড় এন এর চেয়ে অনেক কম ।
isaacg

@ গোষ্ঠী হাস্কেলর ঠিক আছে (এটি আসলে কিছুক্ষণের জন্য বাইরে গিয়েছে এবং আমি কেবল এটি গ্রহণ করতে চেয়েছিলাম কারণ প্রায় কোনও ভোট না থাকা সত্ত্বেও এটি সেরা ছিল, তবে আপনি আরও ভাল কিছু পেলে এগিয়ে যান।)
পাইরুলেজ

@ পাইরুলিজ আমি যা চেষ্টা করি তা ভাল করেই বোঝাচ্ছি এটির ও (এন!) এর জটিলতা রয়েছে ... এটি জটিল
গর্বিত হাসেলেলার ২

উত্তর:


5

হাস্কেল, 259

আমি ভেবেছিলাম আমি এটি আরও ছোট করতে সক্ষম হব। হতেপারে আমি.
এটি ও এর জটিল জটিলতা রয়েছে (n ^ 2 * 2 ^ n) * সুতরাং স্কোরটি প্রায় 6.2e82

* আমি আসলে নিশ্চিত নই, তবে জটিলতায় যদি কোনও "সংযোজন" থাকে তবে তা বহুবর্ষের চেয়ে বেশি নয়, সুতরাং স্কোরটি খুব বেশি পরিবর্তন করা উচিত নয়।

import Data.List
g e=tail$snd$minimum[r|r@(_,b)<-iterate(\l->nubBy((.f).(==).f)$sort[(b+d,c:a)|(b,a)<-l,c<-h\\init a,d<-a!!0%c])[(0,[h!!0])]!!length h,b!!0==h!!0]where h=sort$nub$e>>= \(a,b,_)->[a,b];a%b=[z|(x,y,z)<-e,x==a&&y==b||x==b&&y==a]
f(_,x:b)=x:sort b

এটি কিছুক্ষণ হয়ে গেছে, তবে সেখানে কোনও 'নন-মাইনিফাইড' (সম্ভবত টিকা দেওয়া) সংস্করণ পাওয়া যায় কি? আপনি কীভাবে হাস্কেলের সাথে এই সমস্যাটি সমাধান করেছেন তা আমি আগ্রহী।
হেন্ক মোল্লেমা

5

পাইথন 2, 237 231 228 225 টি অক্ষর

যেহেতু এটি একটি নিষ্পাপ অ্যালগরিদম, এর স্কোর সম্ভবত প্রায় 225! । 1.26e433।

from itertools import*
a=input()
n=lambda*a:tuple(sorted(a))
d=dict((n(*x[:2]),x[2])for x in a)
print min(permutations(set(chain(*[x[:2]for x in a]))),key=lambda x:sum(d.get(n(x[i],x[i+1]),1e400)for i in range(-1,len(x)-1)))

from itertools import*খাটো হবে।
'20

ওহ, ভাল ধারণা ..!
গ্রেগ হিউগিল

আমি এখন পরীক্ষা করতে পারছি না, তাই আমি কেবল ধারণা ফেলে দিচ্ছি। সেট কি প্রয়োজনীয়?
seequ

শহরগুলির তালিকার সদৃশগুলি অপসারণ করতে সেটটি ব্যবহার করা হয়। ইনপুটটিতে যেহেতু এন্ট্রি থাকে না তাই ("a", "a", 0)শূন্য দৈর্ঘ্যের প্রান্তগুলি এড়াতে কোথাও অতিরিক্ত যুক্তিযুক্ত হওয়া প্রয়োজন। (এবং আপনি যদি ওয়েবে থাকেন তবে আপনি সর্বদা কোডপ্যাড.অর্গ.এর মতো কিছু দিয়ে পরীক্ষা করতে পারেন ))
গ্রেগ হিউগিল

পাইথন সম্পর্কে আমি বেশি কিছু জানি না, তবে আপাতদৃষ্টিতে আপনি sumএকটি আদেশের প্রতিটি আইটেমটি চেয়েছিলেন । তা হবে না O(n!*n)?
জিমি 23013

4

জুলিয়া, 213 অক্ষর

সম্ভবত যায় n!n, তাই 2e407 ডলার।

a=[("New York", "Detroit", 2.2), ("New York", "Dillsburg", 3.7), ("Hong Kong", "Dillsburg", 4), ("Hong Kong", "Detroit", 4), ("Dillsburg", "Detroit", 9000.1), ("New York", "Hong Kong", 9000.01)]
f(a)=(
d(x,y)=(r=filter(z->x in z&&y in z,a);r==[]?Inf:r[1][3]);
m=Inf;
q=0;
c=unique([[z[1] for z=a],[z[2] for z=a]]);
n=length(c);
for p=permutations(c);
    x=sum([d(p[i],p[mod1(i+1,n)]) for i=1:n]);
    x<m&&(m=x;q=p);
end;
q)
f(a)

পঠনযোগ্যতা এবং ব্যবহার প্রদর্শনের জন্য আমি কিছু আনস্কার্ড নিউলাইন এবং ট্যাব পাশাপাশি উদাহরণ ইনপুট এবং ফাংশনটিতে একটি কল রেখেছি। এছাড়াও আমি একটি অ্যালগরিদম ব্যবহার করেছি যার জন্য n!সময় প্রয়োজন , তবে n!মেমরি নয় , এটি চালানো সামান্য আরও সম্ভাব্য।


আদেশের sumপ্রতিটি আইটেমে কল করা হয়। ও (ন! * এন) হবে না?
jimmy23013

হ্যাঁ, আমি ঠিক বলেছি
gggg

2

পাইথন 3 - 491

আমি ইনপুট গ্রাফ ভেরিয়েবলের দৈর্ঘ্য গণনা করি নি g। এই সমাধানটি ডায়নামিক প্রোগ্রামিং ব্যবহার করে এবং মোট n 6.39e147 এর স্কোরের জন্য n ^ 2 * 2 ^ n এর জটিলতা রয়েছে। আমি এখনও গল্ফিংয়ের জন্য বেশ নতুন, তাই যদি আপনি কোথাও কোথাও বড় কোডের অপচয় দেখতে পান তবে দয়া করে চিম করুন!

g=[("New York", "Detroit", 2.2), ("New York", "Dillsburg", 3.7), ("Hong Kong", "Dillsburg", 4), ("Hong Kong", "Detroit", 4), ("Dillsburg", "Detroit", 9000.1), ("New York", "Hong Kong", 9000.01)]
s=''
c={s:1}
D={}
for t in g:c[t[0]]=1;c[t[1]]=1;D[(t[0],t[1])]=t[2];D[(t[1],t[0])]=t[2];D[('',t[0])]=0;D['',t[1]]=0
V={}
y=[x for x in c.keys() if x!='']
f=''
def n(z,p):
 if(len(p)==len(y)-1):
  global f;f=z
 if(0==len(p)):
  return (D[(z,f)] if (z,f) in D else float('inf'))
 Y=[(float('inf'),'')]
 for P in p:
  if((z,P) in D):
   Y.append((D[(z,P)] + n(P,[m for m in p if m!=P]), P))
 V[(z,tuple(p))]=min(Y)
 return min(Y)[0]
n('',y)
for i in range(len(c)-1):
 N=V[(s,tuple(y))][1]
 print(N)
 s=N
 y.remove(N)

1

গণিত, 66 বাইট

Most@Last@FindShortestTour@Graph[#<->#2&@@@#,EdgeWeight->Last/@#]&

জটিলতার কোনও ধারণা নেই, সুতরাং স্কোরটি কোথাও 10^23এবং এর মধ্যে 10^93


0

রুবি, 198 180 বাইট

G=eval(gets.tr("()","[]"))
C=G.map{|t|[t[0],t[1]]}.flatten.uniq
D=Hash.new(+1.0/0)
G.map{|p|D[[p[0],p[1]]]=D[[p[1],p[0]]]=p[2]}
p C.permutation.map{|l|d=0;p=l[-1];l.map{|c|d+=D[[p,c]];p=c};[d,l]}.sort[0][1]

ইনপুটটি পড়ার প্রথম লাইনটি আনস্কার্ড করা হয়েছে, যেমন মনে হয় অন্য সবাই কী করছে। এছাড়াও, রুবির জন্য কোনও চূড়ান্ত নিউলাইন নেই।

এটি কেবল নির্মমভাবে শহরের সমস্ত অনুমতি তৈরি করে, তাই আমাকে নীচে নামিয়ে দিন O(n!*n)। প্রকৃতপক্ষে, দ্বিতীয় চিন্তার বিষয়ে, এটি তার চেয়েও ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায় কারণ এটি O(n!)এখন পর্যন্ত সেরাদের উপর নজর রাখার পরিবর্তে সমস্ত পথকে সাজায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.