একটি ইউআই এর জন্য অ্যালগরিদম X শতাংশ স্লাইডার দেখায় যার লিঙ্কযুক্ত মানগুলি সর্বদা মোট 100%


11

যে সিস্টেমে আমি বিল্ডিং করছি তাতে ইউআই স্লাইডারগুলির একটি সেট অন্তর্ভুক্ত থাকে (সংখ্যাটি পরিবর্তিত হয়) প্রতিটি 0-100 স্কেল সহ। স্লাইডার দ্বারা আমি বোঝাচ্ছি এমন একটি UI যেখানে আপনি কোনও উপাদান ধরেছেন এবং ভলিউম নিয়ন্ত্রণের মতো এটিকে উপরে এবং নীচে টেনে আনুন। এগুলি একটি অ্যালগরিদমের দ্বারা সংযুক্ত থাকে যা এটি সর্বদা 100 টি নিশ্চিত করে So যখন একজনকে নীচে নামানো হয়, অন্যরা উপরে চলে যায়। সর্বদা মোট হতে হবে 100. সুতরাং এখানে স্লাইডার বিভিন্ন মান আছে, কিন্তু তারা মোট 100%:

----O------ 40
O----------  0
--O-------- 20
--O-------- 20
--O-------- 20

যদি প্রথম স্লাইডার তারপরে 40 থেকে 70 পর্যন্ত ইউপি স্থানান্তরিত করে, অন্যকে ডানদিকে ডানদিকে সরিয়ে নিতে হবে (স্লাইডারটি টানা হওয়ায়)। দ্রষ্টব্য তিনটি স্লাইডার 20 থেকে 10 এ পরিবর্তিত হয়েছে, এবং একটি শূন্যে থেকে যায় কারণ এটি কম যেতে পারে না।

-------O--- 70
O----------  0
-O--------- 10
-O--------- 10
-O--------- 10

অবশ্যই যখন কোনও স্লাইডার 0 বা 100 এ পৌঁছায়, এটি আর কোনও স্থানান্তর করতে পারে না, যা আমার মাথাটি সত্যিই আঘাত করতে শুরু করে। সুতরাং, যদি একটি স্লাইডার উচ্চতর সরানো হয়, অন্যরা নীচের দিকে চলে যায়, তবে তাদের মধ্যে যখন কেউ শূন্যে পৌঁছায় কেবল তখনই যে শূন্যে পৌঁছেনি কেবল তারা নীচে চলে যেতে পারে।

আমি এখানে এটি জিজ্ঞাসা করছি কারণ এই প্রশ্নটি প্রয়োগের নয়, অ্যালগরিদমের সাথে নির্দিষ্ট। FWIW প্ল্যাটফর্মটি অ্যান্ড্রয়েড জাভা, তবে এটি বিশেষভাবে প্রাসঙ্গিক নয় relevant

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


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

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

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

1
আমি বুঝতে পেরেছি ... আমার সমস্যাটি কেবল এটিই যে 60/30/10 বিভাজনের মতো কিছু প্রকাশ করতে 3 টিরও বেশি ক্রিয়নের প্রয়োজন হবে , কারণ 30/10 অংশের সাথে খাঁজ কাটানোর সময় 60 টি ঘোরাফেরা করে। এটি বৃহত্তর তালিকাগুলির সাথে ক্রমহ্রাসমান খারাপ হয়ে যায় এবং এটি কেবলমাত্র অত্যন্ত অস্পষ্ট ইনপুট জন্য উপযুক্ত কারণ আপনি নিজের মাথার সংখ্যায় এটি কখনই পাবেন না।
ড্যানিয়েল বি

2
আপনার একটি ইউএক্স বিন্দু থেকে, আমি পরামর্শ দিচ্ছি যে মোট স্কোরটি স্লাইডারগুলির পাশে এক বিশাল সংখ্যক হিসাবে উপস্থাপিত হবে। আপনি যখন একটি স্লাইডার উপরের দিকে স্লাইড করবেন তখন মোট স্কোর "100" এর উপরে বৃদ্ধি পায় এবং আপনার "পরবর্তী" বোতামটি যে কোনও কিছুই অক্ষম হয়ে যায় যতক্ষণ না ব্যবহারকারী মোট স্কোর হ্রাস করতে অন্য স্লাইডারকে স্লাইড করে until আপনি কখনই বুঝতে পারবেন না যে ব্যবহারকারী যখন অন্য একটি স্লাইডার উপরে স্লাইড করেন তখন ব্যবহারকারীরা অন্য 4 টি স্লাইডার কমাতে চান, তাই চেষ্টাও করবেন না।
গ্রাহাম

উত্তর:


10

লোভী অ্যালগরিদম

যখন একটি স্লাইডার উপরে (নিচে) উপরে চলে যায়, অন্য সমস্তকে নীচে (উপরে) সরানো দরকার। প্রত্যেকের কাছে কিছুটা স্থান রয়েছে যা এটি চলতে পারে (নিচে নেওয়ার জন্য - তাদের অবস্থান, আপের জন্য: 100-অবস্থান)।

সুতরাং যখন একটি স্লাইডার সরে যায়, অন্য স্লাইডারগুলি নিয়ে যান, তারা যে স্থানটি স্থানান্তর করতে পারে সেগুলি অনুসারে বাছাই করুন এবং কেবল সেগুলি দিয়ে পুনরাবৃত্তি করুন।

প্রতিটি পুনরাবৃত্তির উপরে, স্লাইডারটি প্রয়োজনীয় দিকটিতে সরিয়ে নিন (মোট বাম / স্লাইডারে কাতারে সরানোর জন্য মোট) বা যেটি ছোট হতে পারে তার দূরত্বটি সরিয়ে দিন।

এটি জটিলতায় রৈখিক (যেহেতু আপনি একবারে সাজানোর পরে একবারে একই ক্রমযুক্ত সারিতে ব্যবহার করতে পারেন)।

এই দৃশ্যে, কোনও স্লাইডার আটকে না যায়, সকলেই তাদের যথাসম্ভব সরানোর চেষ্টা করে, তবে কেবল তাদের ন্যায্য অংশ পর্যন্ত।

ওজনযুক্ত পদক্ষেপ

তাদের করা চলাফেরার ওজন হ্রাস করা একটি ভিন্ন পদ্ধতির হবে। আমি মনে করি আপনি "স্লাইডার 0-তে আটকে যান" বিবৃতি দিয়ে বিচার করে আপনি এটি করার চেষ্টা করেছিলেন I আইএমএইচও এটি আরও স্বাভাবিক, আপনার আরও বেশি টুইট করা দরকার।

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

এটি পূর্ববর্তী অংশের মতো পরিভাষায় বেশ অনুরূপ - স্লাইডারগুলির অবস্থান অনুসারে করা পদক্ষেপটি ওজন করবেন না , তারা যে দিকে যেতে পারে সেই স্থান দিয়ে এটি ওজন করুন ।


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

1

আমি যে পদ্ধতিটি গ্রহণ করব তা সামান্য আলাদা এবং প্রতিটি স্লাইডারের আলাদা অভ্যন্তরীণ উপস্থাপনা ব্যবহার করে।

  1. প্রতিটি স্লাইডার ০.১০০ (এক্স) থেকে যে কোনও মান নিতে পারে যা সেই স্লাইডারের জন্য ওজন ফ্যাক্টর হিসাবে ব্যবহৃত হয় (% নয়)

  2. মোট চিত্র (টি) পেতে সমস্ত স্লাইডার মান যুক্ত করুন

  3. প্রতিটি স্লাইডারের প্রদর্শিত মান নির্ধারণ করতে রাউন্ড (এক্স * 100 / টি) ব্যবহার করুন

  4. যখন একটি স্লাইডার উপরে বা নীচে সরানো হয়, আপনি কেবলমাত্র একটি স্লাইডারের মান পরিবর্তন করেন ; অন্যান্য স্লাইডারের তুলনায় সেই স্লাইডারের ওজন বৃদ্ধি বা হ্রাস পাবে এবং উপরের ক্যালকটি নিশ্চিত করবে যে সমস্ত অন্যান্য স্লাইডারে পরিবর্তন যথাসম্ভব সমানভাবে ছড়িয়ে দেওয়া হবে।


ব্যবহারকারী যদি কম বেশি সুনির্দিষ্ট ভগ্নাংশ তৈরির বিষয়ে উদ্বিগ্ন থাকেন তবে এটি একটি ভাল ইন্টারফেস হবে। তবে অন্যান্য স্লাইডগুলি তাদের অবস্থানের সমানুপাতিকভাবে সরানো থেকে কীভাবে এটি কার্যত পৃথক তা আমি দেখতে পাচ্ছি না।
আদেশ

1

আমি মনে করি আপনি 'মুভিড' স্লাইডারের পরিবর্তনের শতাংশের দ্বারা বর্তমান মানকে সামঞ্জস্য করার চেষ্টা করে জিনিসগুলিকে অতিরিক্ত জটিল করে তুলছেন, যা আপনাকে গোলের ত্রুটিগুলি প্রবর্তন করে এমন শতাংশের শতাংশ দেয় gives

যেহেতু আপনি জানেন যে আপনি কেবল সর্বমোট 100 এর মূল্যের সাথে লেনদেন করেন, তাই আমি গোলগুলি নিয়ে কোনও গুরুতর গোলমাল এড়াতে 100 এর থেকে জিনিসগুলিকে পুরোপুরি হিসাবে রেখেছি এবং পিছনের দিকে কাজ করব। (নীচের উদাহরণে আমি সম্পূর্ণ পূর্ণসংখ্যা হিসাবে কোনও বৃত্তাকার হ্যান্ডেল করি)

আমার কৌশলটি স্লাইডারগুলিকে সাধারণ 0-100 হিসাবে সেট করা হবে। পুনরায় বিতরণ করতে কতটা কাজ করতে 100 থেকে 'নতুন' মানটি বিয়োগ করুন, অন্য ওজনগুলির সাথে তাদের ওজন অনুসারে ছড়িয়ে দিন, তারপর পরিষ্কার করুন)

এটি যতটা না আমি সচেতন, বৈধ অ্যান্ড্রয়েড কোড নয়: পি

// see how much is "left" to redistribute
amountToRedistribute = 100 - movedSlider.value

//What proportion of the original 100% was contained in the other sliders (for weighting)
allOtherSlidersTotalWeight = sum(other slider existing values)

//Approximately redistribute the amount we have left between the other sliders, adjusting for their existing weight
for each (otherSlider)
    otherSlider.value = floor(otherSlider.value/allOtherSlidersWeight * amountToRedistribute)
    amountRedistributed += otherSlider.value

//then clean up because the floor() above might leave one or two leftover... How much still hasn't been redistributed?
amountLeftToRedistribute -= amountRedistributed

//add it to a slider (you may want to be smarter and add in a check if the slider chosen is zero, or add it to the largest remaining slider, spread it over several sliders etc, I'll leave it fairly simple here)
otherSlider1.value += amountLeftToRedistribute 

এটি অভ্যন্তরীণভাবে কোনও 0 বা 100 মান হ্যান্ডেল করা উচিত


0

রাউন্ড রবিন পদ্ধতির কী হবে? এমন একটি লেনদেন তৈরি করুন যা নিশ্চিত করে যে কোনও স্লাইডারে মান যুক্ত করা তার পিয়ার থেকে হ্রাস পাবে। এবং বিপরীতভাবে.

তারপরে প্রতিবার কোনও স্লাইডার পরিবর্তনে কোনও পৃথক পিয়ার স্লাইডার দিয়ে লেনদেন চালানো হবে (আমি এমন একটি পুনরাবৃত্তকারী তৈরি করব যা পিয়ার স্লাইডারকে ঘুরে ফিরে আসবে)। পিয়ার স্লাইডারটি যদি শূন্য হয় তবে পরেরটিতে এগিয়ে যান।


0

@ অর্ডাসের দুর্দান্ত লোভী অ্যালগরিদম উত্তরটি সবিস্তারে ব্যাখ্যা করার জন্য। পদক্ষেপগুলির একটি ব্রেকডাউন এখানে।

  1. স্লাইডার সরান
  2. পার্থক্যটি সংরক্ষণ করুনএটি নতুন ভ্যালু - ওল্ডভ্যালু হিসাবে স্থানান্তরিত হয়েছে (ইতিবাচক মান মানে এটি উপরে সরানো হয়েছে এবং অন্যান্য স্লাইডারগুলি নীচে এবং বিপরীতে সরানো প্রয়োজন)
  3. সাজান অন্যদের তালিকায় থেকে অন্তত সবচেয়ে এর দূরত্ব তারা স্থানান্তর করতে পারেন দিক প্রয়োজনীয় মধ্যে differenceAmount ইতিবাচক বা নেতিবাচক হচ্ছে।
  4. পরিমাণ সেট করুন টোমোভ = ডিফারেন্সঅ্যামাউন্ট / বাকী অন্যান্যসমাউন্ট
  5. লুপের মাধ্যমে এবং প্রতিটি স্লাইডার সরানো পারেন পরিমাণ করতে সরানো বা amountToMove । যেটি ছোট
  6. পরিমাণ স্লাইডার বিয়োগ পদক্ষেপ করেনি থেকে amountToMove এবং দ্বারা বিভক্ত করা নতুন অবশিষ্ট OthersCount
  7. একবার শেষ হয়ে গেলে আপনি সফলভাবে অন্যান্য স্লাইডারের মধ্যে পার্থক্যমন্ট বিতরণ করেছেন ।

এখানে চমত্কার উত্তর। stackoverflow.com/a/44369773/4222929
শন

-3

একটি সহজ কৌশল হ'ল স্লাইডার মানের সমষ্টি সম্পর্কিত স্লাইডার মানগুলির শতাংশের গণনা করা এবং তারপরে স্লাইডার মানগুলি স্বতন্ত্র গণিত শতাংশে পুনর্নির্দিষ্ট করা। এইভাবে স্লাইডার মানগুলি পড়তে হবে যেমনঃ

slider1.value = (slider1.value / sumOfSliderValues) * 100 ;
slider2.value = (slider2.value / sumOfSliderValues) * 100 ;
slider3.value = (slider3.value / sumOfSliderValues) * 100 ;

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

আমি এঙ্গুলারগুলি ব্যবহার করে এটি প্রদর্শনের জন্য একটি ফ্রিডল সেটআপ করেছি। ডেমো দেখুন দয়া করে


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