পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং


21

ভূমিকা

পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিংয়ের জন্য একটি solver লিখুন ।

চ্যালেঞ্জ

আপনার কাজটি পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং (আইএলপি) এর জন্য সলভার লেখার কাজ। আইএলপিতে, অজানা এক সেট (যা প্রত্যেকেই পূর্ণসংখ্যা) এর রৈখিক বৈষম্য দেওয়া হয় এবং লিনিয়ার ফাংশনের সর্বাধিক বা সর্বাধিক সন্ধান করা লক্ষ্য।

উদাহরণস্বরূপ, অসমতার জন্য ( মিশ্র পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং থেকে নেওয়া উদাহরণ )

 4x+2y-15≤0
  x+2y- 8≤0
  x+ y- 5≤0
- x      ≤0
   - y   ≤0

এবং উদ্দেশ্য ফাংশন 3x+2y, উদ্দেশ্যমূলক ফাংশন সর্বাধিক হওয়া উচিত 12( x=2,y=3), সর্বনিম্ন হওয়া উচিত 0( x=y=0)।

ইনপুটটি 2 ডি অ্যারে হিসাবে দেওয়া হয় (বা স্ট্যান্ডার্ড স্পেসিফিকেশন অনুসরণ করে কোনও সমতুল্য), প্রতিটি সারি চূড়ান্ত সারি বাদে একটি বৈষম্যের সাথে মিলে যায়। অ্যারেতে থাকা সংখ্যাগুলি সহগ এবং এই ≤0অংশটি সর্বদা বাদ দেওয়া হয়। যদি nপ্রতিটি সারিতে উপাদান থাকে তবে এর অর্থ n-1অজানা রয়েছে।

অ্যারের শেষ সারিটি লিনিয়ার ফাংশনের সাথে মিলে যায়। সহগ তালিকাবদ্ধ করা হয়।

উদাহরণস্বরূপ, উপরের সমস্যার জন্য ইনপুট অ্যারেটি হ'ল

[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].

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

নিম্নলিখিত সমস্যাটির জন্য (উপরের সমস্যা থেকে দুটি বিধিনিষেধ সরিয়ে নেওয়া হয়েছে):

[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].

সর্বাধিক এখনও রয়েছে 12, তবে সর্বনিম্ন উপস্থিত নেই এবং উদ্দেশ্যমূলক ক্রিয়ায় নির্বিচারে বৃহত্তর (পরম মানের অর্থে) নেতিবাচক মান থাকতে পারে। এই ক্ষেত্রে, প্রোগ্রামটির আউটপুট হওয়া উচিত 12, উত্তরদাতাদের দ্বারা নির্ধারিত একটি মিথ্যা মান অনুসরণ করে। অন্য কেসটি হ'ল এখানে কোনও সমাধান নেই example

[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].

এই ক্ষেত্রে, মিথ্যা মানগুলি আউটপুটও হওয়া উচিত। উদ্দেশ্যটি কার্যকরীকরণের জন্য "অনুকূল মান" অসীম এবং কেস যেখানে কোনও সমাধান নেই সে ক্ষেত্রে এটি নির্ধারণ করা ভাল হবে, তবে এটি প্রয়োজনীয় নয়।

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

পরীক্ষার মামলা

@ কিরিলএলে ক্রেডিট। মূল পরীক্ষার স্যুটে একটি বাগ খুঁজে পেতে এবং আইএলপি সমস্যাগুলি সম্পর্কে আমার উপলব্ধি আরও গভীর করার জন্য

Input
Output

[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,1]]
[1,13]

[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]]
[-inf, 12]

[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]]
[NaN, NaN]

[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[5,5,5,5,6,7]]
[55, inf]

[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[0,0,0,0,0,4]]
[4, 4]

[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[0,0,4]]
[NaN, NaN]

চশমা

  • ব্যতিক্রম হ্যান্ডলিং সম্পর্কে চিন্তা করার দরকার নেই।

  • এটি , সর্বনিম্ন বাইট জিতেছে।

  • অজানা সর্বধিক সংখ্যা: 9। অসাম্য সর্বধিক সংখ্যা: 12

  • আপনি কোনও স্ট্যান্ডার্ড ফর্মের মাধ্যমে ইনপুট নিতে এবং আউটপুট সরবরাহ করতে পারেন , এবং আপনি বিন্যাসটি চয়ন করতে পারেন নিখরচায়।

  • যথারীতি এখানে ডিফল্ট লুফোলগুলি প্রয়োগ হয়।



আপনি কার্যের বর্ণনায় এটি স্পষ্টভাবে উল্লেখ করেননি, তবে আমার সন্দেহ হয় যে আপনি অ্যালগরিদমের মূল বাস্তবায়ন চাইছেন, এবং এমন কিছু বোরিং কোড নেই যা বিদ্যমান লাইব্রেরি ব্যবহার করে? তবুও, আমি আপনার পরীক্ষার কেসগুলি আর এর সাথে খেলেছি এবং ফলাফলগুলি ঠিক পুনরুত্পাদন করতে পারিনি E তবে তারপরে [-inf, 12] কেসটিও সাধারণ ফলাফল দেয় [0, 12]। অন্যদিকে, যখন নিম্ন সীমাটি ইনফ থাকে তখন [55, inf] কেস ন্যূনতম এবং সর্বাধিক উভয় পরিস্থিতিতে সমাধান করতে ব্যর্থ হয়।
ক্যারিল এল

হ্যাঁ আমি মূল বাস্তবায়নগুলি খুঁজছি।
ওয়েজুন চাউ

@KirillL। আপনি কি কোনও ভেক্টর সরবরাহ করতে পারেন যেখানে পরীক্ষার ক্ষেত্রে [55, inf] 55 টির চেয়ে কম মান দেয়? আমি কেবল এটি একটি অনলাইন সলভারের বিরুদ্ধে পরীক্ষা করেছি এবং কেসটি ঠিক আছে বলে মনে হচ্ছে। এই পরীক্ষার কেসটি করার সময় আমার নিম্নোক্ত যুক্তি রয়েছে: প্রথম সীমাবদ্ধতার জন্য সমস্ত বিনামূল্যে ভেরিয়েবলের সমষ্টি 8 গিঙ্ক 8 হওয়া দরকার, তবে দ্বিতীয়টি শেষের ব্যতীত সকলের যোগফলের 0 প্রয়োজন হয়। যদি আমরা কখনও হ্রাস করার চেষ্টা করি প্রথম 4 টি বিনামূল্যে যেকোনটি হ্রাস করে লক্ষ্যটির জন্য চূড়ান্ত ভারটি সমান পরিমাণে বাড়ানো প্রয়োজন তাই লক্ষ্যটির জন্য আরও বড় মান।
ওয়েইজুন চিউ

এটি আমার স্নিপেট , যদিও এটি লাইব্রেরি হারিয়ে যাওয়ার কারণে টিআইওতে কাজ করবে না। এটি 55 দেয়, তবে আমি যখন সেট.বাউন্ডস লাইনটি অসম্পূর্ণ করি তখন "মডেলটি আনবাউন্ডেড" থাকে না। যদিও বেশিরভাগ ক্ষেত্রে ত্রুটিটি আমার দিকে রয়েছে। আপনি কি অনলাইন সলভারকে একটি লিঙ্ক দিতে পারেন?
কিরিল এল

উত্তর:


2

পাইথন 3 , 534 বাইট

import itertools as t
import operator as o
I=float("inf")
e=lambda p,A:sum([i[0]*i[1]for i in zip(p,A[:-1])])+A[-1]
def w(x,j):
	d=len(x[0])-1;C=[0]*d;v,w=I,I
	while 1:
		L={(*n,):(sum([0 if e(n,A)<=0 else e(n,A)for A in x[:-1]]),j*e(n,x[-1]))for n in [[sum(a) for a in zip(C,c)]for c in t.product(*[[-1,0,1]]*d)]};C,P=min(L.items(),key=o.itemgetter(1))[0],C;v,w,p,q=L[C][0],L[C][1],v,w
		if(all([e(C,A)<=e(P,A)for A in x[:-1]]))*(j*(e(C,x[-1])-e(P,x[-1]))<0)+(p==v>0):return I
		if(p==v)*(q<=w):return j*q
f=lambda x:(w(x,1),w(x,-1))

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

সংক্ষিপ্ত বিবরণ

এটি একটি পুনরাবৃত্ত অ্যালগরিদম, উত্স থেকে শুরু করে। এটি প্রতিবেশী অবস্থানগুলি সংগ্রহ করে এবং একটি সম্ভাব্য ফাংশন নির্ধারণ করে: অবস্থানটি x:(a,b)কোথায় , প্রতিটি লিনিয়ার অসমতার অর্ধেক স্থান থেকে অবস্থানের দূরত্বগুলির যোগফল, সেই অবস্থানের উদ্দেশ্যটির মান।xab

x:(a,b) < y:(c,d)iff a<cবাa=c and b<d

পুনরাবৃত্তি থামবে, যখন:

  • সম্ভাবনার প্রথম স্থানাঙ্ক হ্রাস হয়নি এবং ইতিবাচক: সিস্টেমটি অক্ষম as
  • প্রতিটি অর্ধ-স্থান থেকে দূরত্ব ঠিক যেমন উদ্দেশ্যটির মতো হ্রাস পেয়েছে: সিস্টেমটি সীমাহীন।
  • পূর্বের এবং সম্ভাব্যগুলির কোনওটিই হ্রাস পায় নি: এটি সর্বোত্তম মান।

1

মতলব, 226 বাইট

অস্বীকৃতি : কেবল "মজাদার" জন্য একটি "আসল" বাস্তবায়ন নয়।

intlinprogফাংশনটির সুবিধা গ্রহণের সহজ সমাধান :

function r=f(a);b=-1*a(1:end-1,end);p=a(end,1:end-1);c=a(1:end-1,1:end-1);[~,f,h]=intlinprog(p,1:size(a,2)-1,c,b);[~,g,i]=intlinprog(-p,1:size(a,2)-1,c,b);s=[inf,nan,f];t=[inf,nan,g];r=a(end,end)+[s(4-abs(h)) -t(4-abs(i))];end

এটি অনুকূল মানগুলি, বা ইনফ (-inf) সমস্যাটি আনবাউন্ডেড বা নানান যদি এটি অযোগ্য হয় তবে তা প্রদান করে।

a = [4 2 -15; 1 2 -8; 1 1 -5; -1 0 0; 0 -1 0; 3 2 1]
b = [4 2 -15; 1 2 -8; 1 1 -5; 3 2 0]
c = [4 2 -15; -1 -2 7; -1 0 3; 0 1 0; 3 2 0]
d = [-1 -1 -1 -1 -1 8;  1 1 1 1 0 0; 0 0 0 0 0 4]
e = [4 2 -15; -1 -2 7; -1 0 3; 0 1 0; 0 0 4]

>> f(a)
ans =

     1    13

>> f(b)
ans =

   Inf    12

>> f(c)
ans =

   NaN   NaN

>> f(d)
ans =

     4     4

>> f(e)
ans =

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