সর্বনিম্ন ব্যয় প্রবাহ সমস্যা


9

একটি প্রবাহ নেটওয়ার্ক হ'ল G = (V, E)উত্স শীর্ষবিন্দু s ϵ Vএবং একটি ডুবন্ত ভার্টেক্স সহ একটি নির্দেশিত গ্রাফ t ϵ Vএবং যেখানে (u, v) ϵ Eগ্রাফের প্রতিটি প্রান্ত (সংযোগকারী নোড u ϵ Vএবং v ϵ V) এর সাথে 2 টি পরিমাণ যুক্ত থাকে:

  1. c(u, v) >= 0, প্রান্তের ক্ষমতা
  2. a(u, v) >= 0, প্রান্তের মাধ্যমে এক ইউনিট প্রেরণের ব্যয়

আমরা একটি ফাংশনকে 0 <= f(u, v) <= c(u, v)প্রদত্ত প্রান্তের মধ্য দিয়ে যাওয়া ইউনিটের সংখ্যা হতে সংজ্ঞায়িত করি (u, v)। সুতরাং, প্রদত্ত প্রান্তের জন্য ব্যয় (u, v)হয় a(u, v) * f(u, v)সর্বনিম্ন খরচের প্রবাহ সমস্যা একটি প্রদত্ত প্রবাহ পরিমাণ জন্য সব প্রান্ত উপর মোট খরচ কমানোর হিসাবে সংজ্ঞায়িত করা হয় d, নিম্নলিখিত পরিমাণ কর্তৃক প্রদত্ত:

মূল্য

নিম্নলিখিত সীমাবদ্ধতা সমস্যাটি প্রয়োগ করে:

  1. সক্ষমতা প্রয়োজনীয়তা : প্রদত্ত প্রান্তের মধ্য দিয়ে প্রবাহটি এই প্রান্তের ( f(u, v) <= c(u, v)) এর সক্ষমতা অতিক্রম করতে পারে না ।
  2. প্রতিস্ফোটিত প্রতিসাম্য : যখন দিকটি বিপরীত হয় তখন প্রদত্ত প্রান্তটি অবশ্যই অ্যান্টিসিমমেট্রিক হতে হবে ( f(u, v) = -f(v, u))।
  3. ফ্লো সংরক্ষণ : যে কোনও নন-সিঙ্ক নন-সোর্স নোডের নেট প্রবাহ অবশ্যই 0 (প্রত্যেকের জন্য u ∉ {s, t}, সর্বোপরি সমষ্টি w, sum f(u, w) = 0) হতে হবে।
  4. প্রয়োজনীয় প্রবাহ : উত্সের বাইরে নেট প্রবাহ এবং সিঙ্কের মধ্যে নেট প্রবাহ উভয়ই নেটওয়ার্কের মাধ্যমে প্রয়োজনীয় প্রবাহের সমান হওয়া উচিত (সর্বোপরি সংশ্লেষ u, sum f(s, u) = sum f(u, t) = d)।

একটি প্রবাহ নেটওয়ার্ক Gএবং প্রয়োজনীয় প্রবাহ দেওয়া d, dনেটওয়ার্কের মাধ্যমে ইউনিট প্রেরণের জন্য সর্বনিম্ন ব্যয় আউটপুট । আপনি ধরে নিতে পারেন যে কোনও সমাধান রয়েছে। dএবং সমস্ত ক্ষমতা এবং ব্যয় অ-নেতিবাচক পূর্ণসংখ্যার হবে। Nলেবেলযুক্ত শীর্ষদিকের একটি নেটওয়ার্কের জন্য [0, N-1], উত্সের শিখরটি হবে 0এবং সিঙ্কের শীর্ষটি হবে N-1

এই , তাই সংক্ষিপ্ত উত্তর (বাইটে) জেতে। মনে রাখবেন যে এটি ভাষার পাশাপাশি ভাষার মধ্যেও একটি প্রতিযোগিতা, সুতরাং ভার্ভোজ ভাষায় কোনও সমাধান পোস্ট করতে ভয় পাবেন না।

বিল্ট-ইনগুলি অনুমোদিত, তবে একই উত্তরের অতিরিক্ত সমাধান হিসাবে, বা একটি স্বাধীন উত্তর হিসাবে, বিল্টইনগুলি ছাড়াই সমাধানগুলি অন্তর্ভুক্ত করার জন্য আপনাকে উত্সাহ দেওয়া হবে।

ইনপুট যে কোনও যুক্তিসঙ্গত পদ্ধতিতে হতে পারে যার মধ্যে প্রতিটি প্রান্তের চাহিদা এবং চাহিদা এবং সামর্থ্য রয়েছে।

পরীক্ষার কেস

পরীক্ষার কেসগুলি নিম্নলিখিত বিন্যাসে সরবরাহ করা হয়:

c=<2D matrix of capacities> a=<2D matrix of costs> d=<demand> -> <solution>

c=[[0, 3, 2, 3, 2], [3, 0, 5, 3, 3], [2, 5, 0, 4, 5], [3, 3, 4, 0, 4], [2, 3, 5, 4, 0]] a=[[0, 1, 1, 2, 1], [1, 0, 1, 2, 3], [1, 1, 0, 2, 2], [2, 2, 2, 0, 3], [1, 3, 2, 3, 0]] d=7 -> 20
c=[[0, 1, 1, 5, 4], [1, 0, 2, 4, 2], [1, 2, 0, 1, 1], [5, 4, 1, 0, 3], [4, 2, 1, 3, 0]] a=[[0, 1, 1, 2, 2], [1, 0, 2, 4, 1], [1, 2, 0, 1, 1], [2, 4, 1, 0, 3], [2, 1, 1, 3, 0]] d=7 -> 17
c=[[0, 1, 4, 5, 4, 2, 3], [1, 0, 5, 4, 3, 3, 5], [4, 5, 0, 1, 5, 5, 5], [5, 4, 1, 0, 3, 2, 5], [4, 3, 5, 3, 0, 4, 4], [2, 3, 5, 2, 4, 0, 2], [3, 5, 5, 5, 4, 2, 0]] a=[[0, 1, 4, 2, 4, 1, 1], [1, 0, 3, 2, 2, 1, 1], [4, 3, 0, 1, 4, 5, 2], [2, 2, 1, 0, 2, 2, 3], [4, 2, 4, 2, 0, 4, 1], [1, 1, 5, 2, 4, 0, 2], [1, 1, 2, 3, 1, 2, 0]] d=10 -> 31
c=[[0, 16, 14, 10, 14, 11, 10, 4, 3, 16], [16, 0, 18, 19, 1, 6, 10, 19, 5, 4], [14, 18, 0, 2, 15, 9, 3, 14, 20, 13], [10, 19, 2, 0, 2, 10, 12, 17, 19, 22], [14, 1, 15, 2, 0, 11, 23, 25, 10, 19], [11, 6, 9, 10, 11, 0, 14, 16, 25, 4], [10, 10, 3, 12, 23, 14, 0, 11, 7, 8], [4, 19, 14, 17, 25, 16, 11, 0, 14, 5], [3, 5, 20, 19, 10, 25, 7, 14, 0, 22], [16, 4, 13, 22, 19, 4, 8, 5, 22, 0]] a=[[0, 12, 4, 2, 9, 1, 1, 3, 1, 6], [12, 0, 12, 16, 1, 2, 9, 13, 2, 3], [4, 12, 0, 2, 2, 2, 2, 10, 1, 1], [2, 16, 2, 0, 2, 1, 8, 4, 4, 2], [9, 1, 2, 2, 0, 5, 6, 23, 5, 8], [1, 2, 2, 1, 5, 0, 13, 12, 12, 1], [1, 9, 2, 8, 6, 13, 0, 9, 4, 4], [3, 13, 10, 4, 23, 12, 9, 0, 13, 1], [1, 2, 1, 4, 5, 12, 4, 13, 0, 13], [6, 3, 1, 2, 8, 1, 4, 1, 13, 0]] d=50 -> 213

এই পরীক্ষার কেসগুলি নেটওয়ার্কএক্স পাইথন গ্রন্থাগারের সাথে গণনা করা হয়েছিল ।



1
দীর্ঘক্ষণ গল্ফিং করে তখন বুঝতে পারছিলাম যে আমি ভুল অ্যালগরিদম গল্ফ করছি কারণ আমি পড়তে পারি না
কুইনটেক

উত্তর:


3

[আর + এলপি সলভ ], 201 186 149 144 বাইট

function(c,a,d,`^`=rep,N=ncol(c),G=diag(N),P=t(1^N),M=P%x%G+G%x%-P)lpSolve::lp(,a,rbind(M,diag(N*N)),c('=','<')^c(N,N*N),c(d,0^(N-2),-d,c))$objv

এটি অনলাইন চেষ্টা করুন!

কোডটি নিম্নলিখিত লিনিয়ার সমস্যা তৈরি করে এবং lpSolveপ্যাকেজ ব্যবহার করে এটি সমাধান করে :

minxV yVAx,yfx,ysubject to:xVfv,xfx,v=0vV:v{s,t}xVfs,xfx,s=dxVft,xfx,t=dfx,bCx,bxV,yV
যেখানে:

  • V শীর্ষবিন্দুগুলির সেট
  • s এর উত্স ভার্টেক্স
  • t গুলি লক্ষ্য (বা ডুবে) শীর্ষবিন্দু
  • Ax,y প্রান্তের প্রবাহের ব্যয়x -> y
  • fx,y হ'ল x -> yঅনুকূল সমাধানের প্রবাহ
  • d বেসিনে এ প্রয়োজন প্রবাহ (অর্থাত এ চাহিদা এবং উৎপাদন )ts
  • Cx,y edge প্রান্তের সর্বাধিক ক্ষমতাx -> y

দুর্দান্ত, রৈখিক প্রোগ্রামিং :) দুর্ভাগ্যক্রমে বেশিরভাগ ভাষায় একটি নেই lpSolve... :(
কুইনটেক

দুর্ভাগ্যক্রমে এটি সত্য ... বিটিডাব্লু এটি বেস-আর এ উপলব্ধ নয়, এটি একটি প্যাকেজ ... আমাকে
টিআইওতে

কোন কারণে মিনকোস্টফ্লো হয়ে ওঠার জন্য আমি এখনও মিনকোস্টম্যাক্সফ্লো সংশোধন করার একটি ছোট উপায় খুঁজে পাইনি ... আমার মস্তিষ্ক ভাজা লোল, আমি আশা করি গণিত ব্যতীত অন্য ভাষায় এর জন্য কোনও অনুষ্ঠান হত
কুইনটেক

@ কুইন্টেক: আপনি কি মিনকোস্টম্যাক্সফ্লোয়ের একটি নির্দিষ্ট প্রয়োগ (উদাহরণস্বরূপ কোনও নির্দিষ্ট ভাষায়) উল্লেখ করছেন?
digEmAll সমস্ত

না, আমার হাত কোডড অ্যালগরিদম
কুইনটেক

1

ওল্ফ্রাম ভাষা, 42 বাইট

FindMinimumCostFlow[#,1,VertexCount@#,#2]&

তুচ্ছ বিল্টিন অ-অন্তর্নির্মিত সমাধান শীঘ্রই আসছে।


এটা কি 6-8 সপ্তাহে আসবে? : পি
কুইন্টেক

1

পাইথন 3 + নেটওয়ার্কএক্স , 137 বাইট

from networkx import*
def f(g,d,z='demand'):N=len(g)**.5//1;G=DiGraph(g);G.node[0][z]=-d;G.node[N-1][z]=d;return min_cost_flow_cost(G)

কোনও ট্রিআইটঅনলাইন লিঙ্ক নেই কারণ টিআইওতে নেটওয়ার্কএক্স লাইব্রেরি ইনস্টলড নেই

ক্ষমতা এবং ওজনের বৈশিষ্ট্যগুলি সহ গ্রাফ ইনপুটটিকে প্রান্ত তালিকা হিসাবে নেয়:

[(0, 0, {'capacity': 0, 'weight': 0}), (0, 1, {'capacity': 3, 'weight': 1}), (0, 2, {'capacity': 2, 'weight': 1}), (0, 3, {'capacity': 3, 'weight': 2}), (0, 4, {'capacity': 2, 'weight': 1}), (1, 0, {'capacity': 3, 'weight': 1}), (1, 1, {'capacity': 0, 'weight': 0}), (1, 2, {'capacity': 5, 'weight': 1}), (1, 3, {'capacity': 3, 'weight': 2}), (1, 4, {'capacity': 3, 'weight': 3}), (2, 0, {'capacity': 2, 'weight': 1}), (2, 1, {'capacity': 5, 'weight': 1}), (2, 2, {'capacity': 0, 'weight': 0}), (2, 3, {'capacity': 4, 'weight': 2}), (2, 4, {'capacity': 5, 'weight': 2}), (3, 0, {'capacity': 3, 'weight': 2}), (3, 1, {'capacity': 3, 'weight': 2}), (3, 2, {'capacity': 4, 'weight': 2}), (3, 3, {'capacity': 0, 'weight': 0}), (3, 4, {'capacity': 4, 'weight': 3}), (4, 0, {'capacity': 2, 'weight': 1}), (4, 1, {'capacity': 3, 'weight': 3}), (4, 2, {'capacity': 5, 'weight': 2}), (4, 3, {'capacity': 4, 'weight': 3}), (4, 4, {'capacity': 0, 'weight': 0})]

এটি কোডের একটি গল্ফ সংস্করণ যা আমি পরীক্ষার কেসগুলি যাচাই করতে ব্যবহার করি।

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