সীমাবদ্ধতা সন্তুষ্টির সমস্যাটিতে একটি সীমাবদ্ধতা হারিয়েছে


13

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

informations

  • এখানে 6 টি সেশন রয়েছে
  • এখানে 4 টি ভূমিকা রয়েছে
  • এখানে 6 টি অনুশীলন রয়েছে
  • সেখানে 32 জন শিক্ষার্থী রয়েছেন
  • দলে প্রতি শিক্ষার্থী আছে 4 জন

সমস্যা:

4 টি পৃথক সেশনে 4 অনুশীলনে প্রতিটি শিক্ষার্থীকে 4 টি ভূমিকার জন্য বরাদ্দ করুন।

বাধা:

  1. শিক্ষার্থীদের একবার ভূমিকা পালন করা উচিত
  2. শিক্ষার্থীদের 6 টির মধ্যে 4 টি আলাদা অনুশীলন করা উচিত
  3. শিক্ষার্থীদের প্রতি সেশনে একটি করে অনুশীলন করা উচিত
  4. শিক্ষার্থীদের একই সাথীর সাথে একবার দেখা করা উচিত

টেমপ্লেট:

এখানে আমি শিক্ষার্থীদের সাথে টেম্পলেটটি অনুভব করছি, যেখানে প্রতিটি দল 4 জন শিক্ষার্থী নিয়ে গঠিত, অবস্থানগুলি [0, 1, 2 বা 3] তাদের অর্পিত ভূমিকা। প্রতিটি উপলব্ধ অবস্থানের সংখ্যা 1 থেকে 128 পর্যন্ত

[# Semester
   [ # Session
     [ # Practice/Team
1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16],
  [17, 18, 19, 20],
  [21, 22, 23, 24]],
 [[25, 26, 27, 28],
  [29, 30, 31, 32],
  [33, 34, 35, 36],
  [37, 38, 39, 40],
  [41, 42, 43, 44],
  [45, 46, 47, 48]],
 [[49, 50, 51, 52],
  [53, 54, 55, 56],
  [57, 58, 59, 60],
  [61, 62, 63, 64],
  [65, 66, 67, 68],
  [69, 70, 71, 72]],
 [[73, 74, 75, 76],
  [77, 78, 79, 80],
  [81, 82, 83, 84],
  [85, 86, 87, 88],
  [89, 90, 91, 92],
  [93, 94, 95, 96]],
 [[97, 98, 99, 100],
  [101, 102, 103, 104],
  [105, 106, 107, 108],
  [109, 110, 111, 112]],
 [[113, 114, 115, 116],
  [117, 118, 119, 120],
  [121, 122, 123, 124],
  [125, 126, 127, 128]]]

অন্য কথায়:

এটি একটি অধিবেশন:

 [[1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16],
  [17, 18, 19, 20],
  [21, 22, 23, 24]],

সেই দলগুলি একই অনুশীলন করে:

[
    [1, 2, 3, 4],
    [25, 26, 27, 28],
    [49, 50, 51, 52],
    [73, 74, 75, 76],
    [97, 98, 99, 100],
    [113, 114, 115, 116]
]

এই অবস্থানগুলি একই ভূমিকা পালন করে:

[
   1,
   5,
   9,
   13,
   17,
   21,
   25,
   ...
]

আমার এখন পর্যন্ত যা আছে:

পাইথন-সীমাবদ্ধতা ব্যবহার করে আমি প্রথম তিনটি প্রতিবন্ধকে বৈধতা দিতে সক্ষম হয়েছি:

Valid solution : False
            - sessions  : [True, True, True, True, True, True]
            - practices : [True, True, True, True, True, True]
            - roles     : [True, True, True, True]
            - teams     : [False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False]

আকর্ষণীয় হতে পারে তাদের জন্য আমি সহজভাবে এটি করতে পারি:

প্রতিটি শর্তের জন্য আমি AllDifferencesConstraint ব্যবহার করি । উদাহরণস্বরূপ, একটি সেশনের জন্য আমি এটি করি:

problem.addConstraint(AllDifferentConstraint(), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])

আমি দলকে বাধা দেওয়ার কোনও উপায় খুঁজে পাচ্ছি না, পুরোপুরি আমার শেষ চেষ্টাটি semesterছিল:

    def team_constraint(self, *semester):
        students = defaultdict(list)

        # get back each teams based on the format [# Semester [ #Session [# Practice/Team ... 
        teams = [list(semester[i:i+4]) for i in range(0, len(semester), 4)]

        # Update Students dict with all mate they work with
        for team in teams:
            for student in team:
                students[student] += [s for s in team if s != student]

        # Compute for each student if they meet someone more than once 
        dupli = []
        for student, mate in students.items():
            dupli.append(len(mate) - len(set(mate)))

        # Loosly constraint, if a student meet somone 0 or one time it's find
        if max(dupli) >= 2:
            print("Mate encounter more than one time", dupli, min(dupli) ,max(dupli))
            return False
        pprint(students)
        return True

প্রশ্নসমূহ:

  1. দলের কন্ডিশনের জন্য আমি যা চাই তা করা কি সম্ভব? আমার অর্থ হ'ল প্রতিটি ছাত্রকে 12 জন সঙ্গীকে নিয়োগ করা সম্ভব হয়েছে এবং তাদের প্রত্যেকে কেবল একবারই একই সঙ্গীর সাথে দেখা করতে পারলে আমার কোনও ধারণা নেই।
  2. দলের প্রতিবন্ধকতার জন্য, আমি কি আরও পারফরম্যান্ট অ্যালগরিদম মিস করেছি?
  3. আমি অনুসরণ করতে পারি যে কোন পিস্তক?

1
সেশনের শেষ দুটি সেট কেন অন্যদের মতো (4, 4)পরিবর্তিত আকারের (4, 6)?
r.ook

এই কোর্সের কেবলমাত্র একটি ক্রেডিট এবং এ জন্য প্রচুর চাকরির প্রয়োজন রয়েছে তার সাথে মেলে এটি আমার বসের ইচ্ছা যে শিক্ষার্থীদের কেবল ৪ টি অনুশীলন করা উচিত। সুতরাং আমরা এটি নিয়ে এসেছি, আমাদের 32 জন শিক্ষার্থী রয়েছে, তাদের 4 টি অনুশীলন করা উচিত (128 অবস্থান)।
ফ্লোরিয়ান বার্নার্ড

1
আমি এলোমেলো এবং নিষ্ঠুর শক্তি পদ্ধতির চেষ্টা করব। আপনি যেখানে সেশন 1 বেছে নেবেন এমন কোনও আদেশের মতো করুন: ভূমিকা 1 শিক্ষার্থী 1 অনুশীলন 1 ... 2 থেকে 4 এর সমান Then তারপরে প্রতি 6 সেশনের জন্য বর্ধন, ইতিমধ্যে দেখা শিক্ষার্থীদের ফেলে দিন। এলোমেলো একই। কেন 128 পজিশন এবং প্রতি সেশনে 32 শিক্ষার্থী বিভিন্ন ক্রিয়াকলাপে সর্বোচ্চ হিসাবে ব্যবহার করবেন না? হয়তো stackMath তারা আপনি বলতে পারেন এই সম্ভব সমন্বয় / বিন্যাস হল
ক্রিস্টো

বর্তমানে নিষ্ঠুর বল পদ্ধতি পদ্ধতি, আমার বস এটির স্ক্রিপ্ট এবং এর কাজটি সত্যিই ভাল করে আমার কাছে ফিরে এল। তবে আমি এখনও পাইথন ব্যবহার করতে চাই না।
ফ্লোরিয়ান বার্নার্ড

উত্তর:


2

মূল প্রশ্নের উত্তর দেওয়া হবে এরকম কিছু দিয়ে ...

   def person_works_with_different():
        # over all the sessions, each person works with each other person no more than once.
        # 'works with' means in 'same session team'
        for p in all_people:
            buddy_constraint = []
            for s in all_sessions:
                for g in all_teams:
                    p_list = [pv[k] for k in filter(lambda i: i[P] == p and i[S] == s and i[G] == g, pv)]
                    for o in all_people:
                        if o != p:  # other is not person
                            o_list = [self.pv[k] for k in filter(lambda i: i[self.P] == o and i[self.S] == s and i[self.G] == g, self.pv)]
                            tmp = model.NewBoolVar('')
                            buddy_constraint.append(tmp)
                            model.Add(sum(o_list) == sum(p_list)).OnlyEnforceIf(tmp)
                            # tmp is set only if o and p are in the same session/team
            # The number of times a student gets to take part is the number of roles.
            # The size of the group controlled by the number of roles
            model.Add(sum(buddy_constraint) = all_roles * (all_roles - 1)) 

সংযুক্ত সম্পাদনা

গতকাল আপনার সমস্যাটির দিকে আমার আরও নজর ছিল - (স্বীকার করা দীর্ঘ নয়, যেহেতু এই মুহুর্তে আমার অনেক কাজ চলছে), এবং ...

প্রথমত, আমি দেখতে পাচ্ছি যে আপনার 'দল' সত্তা, আমি যেটিকে 'অ্যাকশন' সত্তা বলেছিলাম তার থেকে অনেক বেশি, এবং পূর্ববর্তী ভাষায় আমি মনে করি যে 'দল' (বা 'গ্রুপ') এর পক্ষে আরও ভাল শব্দ ছিল।

আপনি যদি এখনও সীমাবদ্ধতাগুলি সন্ধান করে থাকেন তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি সেগুলি ভেঙে ফেলুন এবং তাদের উপর স্বতন্ত্রভাবে কাজ করুন - বিশেষত দল / ব্যক্তি / সেশন সীমাবদ্ধতাগুলি অনুসরণ করে ভূমিকা / কার্য বাধা।

/ যুক্ত সম্পাদনা

team: a gathering of 4 persons during a session
person (32): a participant of a team
session (6): time: eg, 8am -10am
role (4): what responsibility a person has in an action
task (6): type of action

A person does:
 0..1 action per session-group
 1 role per action
 1 task per action
 0..1 of each task
 1 of each role in an action
 4 persons in an action

A person meets each other person 0..1 times
An action requires exactly 4 people

আমার সম্প্রতি একইরকম সমস্যা হয়েছিল এবং শেষ পর্যন্ত OR- সরঞ্জামগুলিতে পরিণত হয়েছিল। https://developers.google.com/optimization/cp/cp_solver

বিশেষত, নার্সদের সময় নির্ধারণের সমস্যাটি দেখুন: https://developers.google.com/optimization/schedulating/employee_schedule#nurse_schedule

যাইহোক, সমস্যাটি খুব জটিল নয়, তাই কোনও সলভার ব্যবহার করা আপনার পক্ষে ওভারকিল হতে পারে।

তেমনি, এই ধরণের সমস্যার জন্য নেস্টেড তালিকার চেয়ে আপনার ভেরিয়েবলগুলি ধরে রাখতে টিপল-কিড ডিক ব্যবহার করা ভাল:

{দল, অধিবেশন, ব্যক্তি: বুলভার}

মূল কারণ হ'ল আপনি তারপরে ফিল্টারগুলির মাধ্যমে সীমাবদ্ধতা প্রয়োগ করতে পারেন যা নেস্টেড তালিকা ম্যানিপুলেশনগুলি করার চেয়ে অনেক সহজ, উদাহরণস্বরূপ, ব্যক্তি / দল জুড়ে একটি সীমাবদ্ধতা প্রয়োগ করতে, আপনি করতে পারেন (যেখানে ব্যক্তি সূচক 2 এবং দল সূচক হয়) 0):

for p in all_persons:
    for t in all_teams:
        stuff = [b_vars[k] for k in filter(lambda i: i[2] == p and i[0] == t, b_vars)]
        model.Add(sum(stuff) == 4)  # persons per team == 4

1
ধন্যবাদ, লুপের জন্য আপনার অর্থ কি p for p in all_people?
ফ্লোরিয়ান বার্নার্ড

1
হ্যাঁ - দুঃখিত! আমি আপনার মডেলগুলিতে আমার নামগুলি 'অনুবাদ' করেছি, তবে কার্যত তাই ছিলাম কিছুটা দ্রুত।
কনচোগ

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

আমি দুঃখিত তবে আপনার মাথা সমাধানটি অনুসরণ করা শক্তিশালী, স্ব থেকে আসে কোথা থেকে? এবং পি, এস এবং জি ভেরিয়েবলগুলি কী? পিভি কি? আপনার সাহায্যের জন্য ধন্যবাদ.
ফ্লোরিয়ান বার্নার্ড

0

প্রতিটি পুনরাবৃত্তির জন্য কেবলমাত্র একটি ক্রমোটেশন অ্যালগরিদম ধারণা, প্রতিটি শিক্ষার্থীর একটিতে বা প্রতিটি সেশনের একটিতে ফোকাস করা যেতে পারে:

Session 1:
Roles
1,2,3,4
Students
1,2,3,4

(Note is 1st permutation 1234)

Sess 2 for student 1
Roles 1234
Students 5,1,7,6

এখানে শিক্ষার্থী 2 সেশন 1 এ 1 ছাত্রের স্থান নেয় এবং এভাবে চলে

Roles 1234
St 2,5,6,7 

1 এস 3 আর 1234 সেন্ট 10,9,1,8 শিক্ষার্থীর সাথে চালিয়ে যান

S4
R 1234
St 11,12,13,1

শেষে আপনি শিক্ষার্থী 1 এর সাথে ইন্টারঅ্যাকশনগুলি সরিয়ে ফেলুন, যেমন পরবর্তী পুনরাবৃত্তির ক্রম অনুসারে আপনি বর্তমানটি সরিয়ে দেন।

এটি একটি রুবিক কিউবের মতো।

আপনি যদি এই কোডটি পেয়ে থাকেন বা এই আলগো সহ কিছু কোড জানেন তবে আমাকে জানান।

হতে পারে ইটারটোলস ক্রমানুসারে

আমি বিশ্বাস করি যে অনুশীলনের চেয়ে সেশনগুলি হচ্ছে> এর সংখ্যার সাথে এটি প্রাসঙ্গিক নয়। আপনি যখন দৌড়াবেন তখন আরও কিছু পুল বা ঘূর্ণনের জন্য আরও বেশি জায়গা লাগবে room সম্ভবত 4 সেশন = অনুশীলনের জন্য লক্ষ্য রেখে সমস্যাটি সহজতর করতে পারে?

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