অনুরূপ সমস্যা নিয়ে গবেষণা করার সময় আমি এই প্রশ্নটি ছড়িয়ে দিয়েছিলাম: স্তরবদ্ধতা হ্রাস করার জন্য তরলগুলির সর্বোত্তম সংযোজন। দেখে মনে হচ্ছে আমার সমাধানটি আপনার পরিস্থিতির ক্ষেত্রেও প্রযোজ্য হবে।
যদি আপনি 30,20,10 অনুপাতের (যেমন, এ এর 30 ইউনিট, বি এর 20 ইউনিট এবং সি এর 10 ইউনিট) তরল A, B এবং C মিশ্রিত করতে চান তবে আপনি যদি সমস্ত সংযোজন করেন তবে আপনি স্তরের সাথে শেষ করেন এ, তারপরে সমস্ত বি এবং তারপরে সমস্ত সি আপনি ছোট ইউনিটগুলিকে মেশানো ভাল। উদাহরণস্বরূপ, ক্রমানুসারে [A, B, A, C, B, A] একক-ইউনিট সংযোজন করুন। এটি পুরোপুরি স্তরবদ্ধতা প্রতিরোধ করবে।
আমি যেভাবে এটি দেখতে পেয়েছি তা হল এটি অগ্রাধিকারের সারি ব্যবহার করে এক ধরণের মার্জ হিসাবে বিবেচনা করা। আমি সংযোজনগুলি বর্ণনা করার জন্য যদি কোনও কাঠামো তৈরি করি:
MergeItem
Item, Count, Frequency, Priority
ফ্রিকোয়েন্সিটি "প্রতিটি এন-তে একটি" হিসাবে প্রকাশিত হয়। সুতরাং এ, যা ছয়টির মধ্যে তিনবার যুক্ত হয়, তার ফ্রিকোয়েন্সি 2 (6/3) থাকে।
এবং প্রাথমিকভাবে রয়েছে এমন একটি গাদা শুরু করুন:
(A, 3, 2, 2)
(B, 2, 3, 3)
(C, 1, 6, 6)
এখন আমি হ্যাপ থেকে প্রথম আইটেমটি সরিয়ে এটিকে আউটপুট দেব। তারপরে এর গণনাটি 1 দ্বারা হ্রাস করুন এবং ফ্রিকোয়েন্সি দ্বারা অগ্রাধিকার বাড়ান এবং এটি আবার গাদাতে যুক্ত করুন। ফলাফলের স্তূপটি হ'ল:
(B, 2, 3, 0)
(A, 2, 2, 4)
(C, 1, 6, 6)
এরপরে, খকে বিটিকে অপসারণ করুন, আউটপুট এবং আপডেট করুন, তারপরে আবার গাদাতে যুক্ত করুন:
(A, 2, 2, 4)
(C, 1, 6, 6)
(B, 1, 3, 6)
যদি আমি সেই ফ্যাশনটিতে চালিয়ে যাই তবে আমি পছন্দসই মিশ্রণটি পাই। সমান অগ্রাধিকারের আইটেমগুলি যখন গাদা হয়ে inোকানো হয় তখন এটি সর্বাধিক ফ্রিকোয়েন্সি মান সহ (যেমন সর্বনিম্ন ঘন ঘন) প্রথমে আদেশ করা হয় তা নিশ্চিত করতে আমি একটি কাস্টম তুলক ব্যবহার করি use
আমি আমার ব্লগে সমস্যার এবং এর সমাধানের আরও সম্পূর্ণ বিবরণ লিখেছি এবং কিছু কার্যকরী সি # কোড উপস্থাপন করেছি যা এটির চিত্রিত করে। সমানভাবে তালিকায় আইটেম বিতরণ দেখুন ।
মন্তব্যের পরে আপডেট করুন
আমি মনে করি আমার সমস্যাটি ওপি-র সমস্যার সাথে সমান এবং তাই আমার সমাধান সম্ভাব্য উপকারী। ওপির প্রশ্নের শর্তে আমার উত্তর আরও প্রকাশ না করার জন্য আমি ক্ষমাপ্রার্থী।
প্রথম আপত্তিটি, যে আমার সমাধানটি 0, 1, এবং 2 এর পরিবর্তে এ, বি এবং সি ব্যবহার করছে, সহজেই প্রতিকার করা যেতে পারে। এটি কেবল নামকরণের বিষয়। আমি "দু'এক" এর চেয়ে "দু'এ" এর কথা চিন্তা করা এবং বলতে আরও সহজ এবং কম বিভ্রান্তি পেয়েছি। তবে এই আলোচনার উদ্দেশ্যগুলির জন্য আমি ওপি'র নামকরণ ব্যবহার করতে নীচে আমার আউটপুটগুলি সংশোধন করেছি।
অবশ্যই আমার সমস্যা দূরত্বের ধারণা নিয়ে কাজ করে। আপনি যদি "জিনিসগুলি সমানভাবে ছড়িয়ে দিতে চান" তবে দূরত্ব বোঝানো হয়। তবে, আবারও আমার সমস্যাটি ওপি-র সমস্যার সাথে কীভাবে মিল রয়েছে তা পর্যাপ্তরূপে না দেখানোর ক্ষেত্রে এটি ব্যর্থ হয়েছিল।
ওপি সরবরাহ করে দুটি উদাহরণ দিয়ে আমি কয়েকটি পরীক্ষা চালিয়েছি। এটাই:
[1,1,2,2,3,3] // which I converted to [0,0,1,1,2,2]
[0,0,0,0,1,1,1,2,2,3]
আমার নামকরণগুলিতে সেগুলি যথাক্রমে [2,2,2] এবং [4,3,2,1] হিসাবে প্রকাশিত হয় এটি, সর্বশেষ উদাহরণে, "প্রকারের 4 টি আইটেম, 1 ধরণের 3 আইটেম, 2 ধরণের আইটেম এবং 3 ধরণের 1 আইটেম" is
আমি আমার পরীক্ষার প্রোগ্রামটি চালিয়েছি (সাথে সাথে নীচে বর্ণিত), এবং আমার ফলাফল পোস্ট করেছি। ওপি থেকে অনুপস্থিত ইনপুট, আমি বলতে পারব না যে আমার ফলাফলগুলি এর চেয়ে খারাপ, তার চেয়ে খারাপ বা তার চেয়ে ভাল কিনা। বা অন্য কারও ফলাফলের সাথে আমি আমার ফলাফলগুলি তুলনা করতে পারি না কারণ অন্য কেউ কোনও পোস্ট করেনি।
তবুও আমি বলতে পারি যে তরল মিশ্রিত করার সময় অ্যালগোরিদম আমার স্তরবদ্ধতা দূরীকরণের সমস্যার একটি ভাল সমাধান সরবরাহ করে । এবং দেখে মনে হচ্ছে এটি অপের সমস্যার কোনও যুক্তিসঙ্গত সমাধান সরবরাহ করে।
নীচে দেখানো ফলাফলের জন্য, আমি আমার ব্লগ এন্ট্রিতে বিশদ অ্যালগরিদমটি ব্যবহার করেছি, এতে প্রাথমিক অগ্রাধিকার সেট করা হয়েছে Frequency/2
এবং আরও ঘন ঘন আইটেমটির পক্ষে apাল তুলক সংশোধন করা হয়েছে। পরিবর্তিত কোডগুলি এখানে দেখানো হয়েছে, পরিবর্তিত লাইনের সাথে মন্তব্য করা হয়েছে।
private class HeapItem : IComparable<HeapItem>
{
public int ItemIndex { get; private set; }
public int Count { get; set; }
public double Frequency { get; private set; }
public double Priority { get; set; }
public HeapItem(int itemIndex, int count, int totalItems)
{
ItemIndex = itemIndex;
Count = count;
Frequency = (double)totalItems / Count;
// ** Modified the initial priority setting.
Priority = Frequency/2;
}
public int CompareTo(HeapItem other)
{
if (other == null) return 1;
var rslt = Priority.CompareTo(other.Priority);
if (rslt == 0)
{
// ** Modified to favor the more frequent item.
rslt = Frequency.CompareTo(other.Frequency);
}
return rslt;
}
}
ওপির প্রথম উদাহরণ দিয়ে আমার পরীক্ষা প্রোগ্রাম চালানো, আমি পেয়েছি:
Counts: 2,2,2
Sequence: 1,0,2,1,0,2
Distances for item type 0: 3,3
Stddev = 0
Distances for item type 1: 3,3
Stddev = 0
Distances for item type 2: 3,3
Stddev = 0
সুতরাং আমার অ্যালগরিদম সমস্ত সংখ্যা সমান হওয়ার তুচ্ছ সমস্যার জন্য কাজ করে।
ওপি পোস্ট করা দ্বিতীয় সমস্যাটির জন্য, আমি পেয়েছি:
Counts: 4,3,2,1
Sequence: 0,1,2,0,1,3,0,2,1,0
Distances for item type 0: 3,3,3,1
Stddev = 0.866025403784439
Distances for item type 1: 3,4,3
Stddev = 0.471404520791032
Distances for item type 2: 5,5
Stddev = 0
Distances for item type 3: 10
Stddev = 0
Standard dev: 0.866025403784439,0.471404520791032,0,0
আমি এটির উন্নতি করার কোনও সুস্পষ্ট উপায় দেখতে পাচ্ছি না। এটি আইটেম 0 [2,3,2,3] বা 2 এবং 3 এর অন্য কোনও ব্যবস্থার জন্য দূরত্ব তৈরি করতে পুনরায় ব্যবস্থা করা যেতে পারে তবে এটি আইটেম 1 এবং / অথবা 2 এর বিচ্যুতির পরিবর্তন ঘটবে আমি সত্যিই জানি না "সর্বোত্তম" এই পরিস্থিতিতে আছে। আরও ঘন ঘন বা কম ঘন ঘন আইটেমগুলিতে আরও বড় বিচ্যুতি থাকা কি ভাল?
ওপি থেকে অন্যান্য সমস্যার অভাবের কারণে আমি তার বিবরণগুলি নিজের কয়েকটি তৈরি করতে ব্যবহার করেছি। তিনি তার পোস্টে বলেছেন:
একটি সাধারণ তালিকায় quant 50 আইটেম রয়েছে quant 15 বিভিন্ন মান সহ বিভিন্ন পরিমাণে।
সুতরাং আমার দুটি পরীক্ষা ছিল:
[8,7,6,5,5,4,3,3,2,2,2,1,1,1,1] // 51 items, 15 types
[12,6,5,4,4,3,3,3,2,2,2,1,1] // 48 items, 13 types
এবং আমার ফলাফল:
Counts: 8,7,6,5,5,4,3,3,2,2,2,1,1,1,1
Sequence: 0,1,2,3,4,5,7,6,0,1,2,8,9,10,4,3,0,1,5,2,0,1,3,4,6,7,14,11,13,12,0,2,5,1,0,3,4,2,8,10,9,1,0,7,6,5,3,4,2,1,0
Distances for item type 0: 8,8,4,10,4,8,8,1
Stddev = 2.82566363886433
Distances for item type 1: 8,8,4,12,8,8,3
Stddev = 2.76272565797339
Distances for item type 2: 8,9,12,6,11,5
Stddev = 2.5
Distances for item type 3: 12,7,13,11,8
Stddev = 2.31516738055804
Distances for item type 4: 10,9,13,11,8
Stddev = 1.72046505340853
Distances for item type 5: 13,14,13,11
Stddev = 1.08972473588517
Distances for item type 6: 17,20,14
Stddev = 2.44948974278318
Distances for item type 7: 19,18,14
Stddev = 2.16024689946929
Distances for item type 8: 27,24
Stddev = 1.5
Distances for item type 9: 28,23
Stddev = 2.5
Distances for item type 10: 26,25
Stddev = 0.5
Distances for item type 11: 51
Stddev = 0
Distances for item type 12: 51
Stddev = 0
Distances for item type 13: 51
Stddev = 0
Distances for item type 14: 51
Stddev = 0
এবং দ্বিতীয় উদাহরণের জন্য:
Counts: 12,6,5,4,4,3,3,3,2,2,2,1,1
Sequence: 0,1,2,0,3,4,7,5,6,0,1,8,9,10,0,2,0,3,4,1,0,2,6,7,5,12,11,0,1,0,3,4,2,0,1,10,8,9,0,7,5,6,0,
4,3,2,1,0
Distances for item type 0: 3,6,5,2,4,7,2,4,5,4,5,1
Stddev = 1.68325082306035
Distances for item type 1: 9,9,9,6,12,3
Stddev = 2.82842712474619
Distances for item type 2: 13,6,11,13,5
Stddev = 3.44093010681705
Distances for item type 3: 13,13,14,8
Stddev = 2.34520787991171
Distances for item type 4: 13,13,12,10
Stddev = 1.22474487139159
Distances for item type 5: 17,16,15
Stddev = 0.816496580927726
Distances for item type 6: 14,19,15
Stddev = 2.16024689946929
Distances for item type 7: 17,16,15
Stddev = 0.816496580927726
Distances for item type 8: 25,23
Stddev = 1
Distances for item type 9: 25,23
Stddev = 1
Distances for item type 10: 22,26
Stddev = 2
Distances for item type 11: 48
Stddev = 0
Distances for item type 12: 48
Stddev = 0