📋 المحتوى المنظم
📖 محتوى تعليمي مفصّل
6
نوع: QUESTION
أَنشِئ خوارزمية حل برمجة الأعداد الصحيحة المختلطة لمشكلة البائع المتجول، من خلال إكمال المقطع البرمجي التالي، بحيث تنتقي متغيرات القرار وقيود الاتصال انتقاء صحيحًا:
نوع: محتوى تعليمي
def MIP_solver(dist_matrix, location_ids, startstop):
solver = ______________() # creates a solver
solver.verbose = 0 # setting this to 1 will print info on the progress of the solver
# creates every transition from every location to every other location
transitions = list(____________________(location_ids, location_ids))
N = len(location_ids) # number of locations
# creates an empty square matrix full of 'None' values
x = numpy.full((N, N), None)
# adds binary decision variables indicating if transition (i->j) is included in the route
for i, j in transitions:
x[i, j] = solver.____________________(var_type=______________)
# objective function: minimizes the distance
solver.objective = ____________________(xsum(dist_matrix[i, j] * x[i][j] for
i, j in transitions))
# Arrive/Depart Constraints
for i in location_ids:
solver += xsum(____________________ for j in location_ids - {i}) == 1
solver += xsum(____________________ for j in location_ids - {i}) == 1
# Adds a binary decision variable for each location
y = [solver.____________________(var_type=______________) for i in
location_ids]
# Adds connectivity constraints for transitions that do not include the startstop
for (i, j) in product(location_ids - {startstop}, location_ids -
{startstop}):
if i != j: # ignores transitions from a location to itself
solver += y[j] - y[i] >= (N + 1) * x[i, j] - N
solver.____________________() # solves the problem
نوع: METADATA
وزارة التعليم
297
Ministry of Education
2023 - 1445
📄 النص الكامل للصفحة
--- SECTION: 6 ---
أَنشِئ خوارزمية حل برمجة الأعداد الصحيحة المختلطة لمشكلة البائع المتجول، من خلال إكمال المقطع البرمجي التالي، بحيث تنتقي متغيرات القرار وقيود الاتصال انتقاء صحيحًا:def MIP_solver(dist_matrix, location_ids, startstop):solver = ______________() # creates a solver solver.verbose = 0 # setting this to 1 will print info on the progress of the solver
# creates every transition from every location to every other location transitions = list(____________________(location_ids, location_ids))N = len(location_ids) # number of locations
# creates an empty square matrix full of 'None' values x = numpy.full((N, N), None)
# adds binary decision variables indicating if transition (i->j) is included in the route for i, j in transitions:
x[i, j] = solver.____________________(var_type=______________)# objective function: minimizes the distance solver.objective = ____________________(xsum(dist_matrix[i, j] * x[i][j] for i, j in transitions))# Arrive/Depart Constraints for i in location_ids:
solver += xsum(____________________ for j in location_ids - {i}) == 1
solver += xsum(____________________ for j in location_ids - {i}) == 1# Adds a binary decision variable for each location y = [solver.____________________(var_type=______________) for i in location_ids]# Adds connectivity constraints for transitions that do not include the startstop for (i, j) in product(location_ids - {startstop}, location_ids -
{startstop}):
if i != j: # ignores transitions from a location to itself solver += y[j] - y[i] >= (N + 1) * x[i, j] - N solver.____________________() # solves the problem2023 - 1445
📝 أسئلة اختبارية
عدد الأسئلة: 9
سؤال 6: x[i, j] = solver.____________________(var_type=______________)
- أ) addVariable('Binary')
- ب) createVar('Integer')
- ج) addConstraint('Binary')
- د) newVariable('Continuous')
الإجابة الصحيحة: addVariable('Binary')
الشرح: يتم إضافة متغير قرار ثنائي (Binary) باستخدام دالة addVariable مع تحديد نوع المتغير كـ 'Binary' للإشارة إلى ما إذا كان الانتقال (i->j) مدرجًا في المسار
تلميح: ما هي الدالة المستخدمة لإضافة متغيرات في PuLP؟ وما هو نوع المتغير المناسب لمتغيرات ثنائية؟
سؤال 6: أَنشِئ خوارزمية حل برمجة الأعداد الصحيحة المختلطة لمشكلة البائع المتجول، من خلال إكمال المقطع البرمجي التالي، بحيث تنتقي متغيرات القرار وقيود الاتصال انتقاء صحيحًا:
الإجابة الصحيحة: انظر الأسئلة الفرعية
الشرح: هذا سؤال رئيسي يحتوي على أسئلة فرعية تتعلق بإكمال المقطع البرمجي لخوارزمية برمجة الأعداد الصحيحة المختلطة
تلميح: راجع الأسئلة الفرعية أدناه لإكمال الأجزاء الناقصة في الكود
سؤال 6: solver = ______________() # creates a solver
- أ) pulp.LpProblem
- ب) scipy.optimize
- ج) numpy.array
- د) itertools.permutations
الإجابة الصحيحة: pulp.LpProblem
الشرح: يتم إنشاء مشكلة برمجة خطية باستخدام pulp.LpProblem() من مكتبة PuLP لحل مشاكل البرمجة الخطية والأعداد الصحيحة
تلميح: ما هي المكتبة الشائعة لحل مشاكل البرمجة الخطية في بايثون؟
سؤال 6: transitions = list(____________________(location_ids, location_ids))
- أ) product
- ب) permutations
- ج) combinations
- د) zip
الإجابة الصحيحة: product
الشرح: يتم استخدام دالة product من مكتبة itertools لإنشاء جميع الانتقالات الممكنة بين المواقع (المنتج الديكارتي)
تلميح: ما هي الدالة التي تولد جميع التركيبات الممكنة من قائمتين؟
سؤال 6: solver.objective = ____________________(xsum(dist_matrix[i, j] * x[i][j] for i, j in transitions))
- أ) pulp.lpSum
- ب) numpy.sum
- ج) sum
- د) min
الإجابة الصحيحة: pulp.lpSum
الشرح: يتم تعيين دالة الهدف باستخدام pulp.lpSum لحساب مجموع المسافات مضروبة في متغيرات القرار، بهدف تقليل المسافة الإجمالية
تلميح: ما هي الدالة المستخدمة في PuLP لتعيين مجموع كدالة هدف؟
سؤال 6: solver += xsum(____________________ for j in location_ids - {i}) == 1
- أ) x[i, j]
- ب) y[i]
- ج) dist_matrix[i, j]
- د) x[j, i]
الإجابة الصحيحة: x[i, j]
الشرح: هذا القيد يضمن أن كل موقع له انتقال واحد خارج منه (قيد المغادرة) باستخدام مجموع متغيرات القرار x[i, j] لجميع j المختلفة عن i
تلميح: ما هو المتغير الذي يمثل الانتقال من موقع i إلى موقع j؟
سؤال 6: solver += xsum(____________________ for j in location_ids - {i}) == 1
- أ) x[j, i]
- ب) x[i, j]
- ج) y[j]
- د) dist_matrix[j, i]
الإجابة الصحيحة: x[j, i]
الشرح: هذا القيد يضمن أن كل موقع له انتقال واحد وارد إليه (قيد الوصول) باستخدام مجموع متغيرات القرار x[j, i] لجميع j المختلفة عن i
تلميح: ما هو المتغير الذي يمثل الانتقال من موقع j إلى موقع i؟
سؤال 6: y = [solver.____________________(var_type=______________) for i in location_ids]
- أ) addVariable('Integer')
- ب) addVariable('Binary')
- ج) createVar('Continuous')
- د) newVariable('Real')
الإجابة الصحيحة: addVariable('Integer')
الشرح: يتم إنشاء متغيرات قرار صحيحة (Integer) y لكل موقع لفرض قيود الاتصال ومنع الحلقات الفرعية في المسار
تلميح: ما هي الدالة ونوع المتغير المستخدم لمتغيرات صحيحة في PuLP؟
سؤال 6: solver.____________________() # solves the problem
- أ) solve
- ب) optimize
- ج) run
- د) execute
الإجابة الصحيحة: solve
الشرح: يتم استدعاء دالة solve() لحل مشكلة البرمجة الخطية والأعداد الصحيحة المختلطة التي تم تعريفها
تلميح: ما هي الدالة التي تحل المشكلة في PuLP بعد تعريف المتغيرات والقيود والهدف؟
🎴 بطاقات تعليمية للمراجعة
عدد البطاقات: 5 بطاقة لهذه الصفحة
ما هي وظيفة `MIP_solver()` في هذا السياق؟
الإجابة: إنشاء وحل مشكلة برمجة الأعداد الصحيحة المختلطة (Mixed Integer Programming - MIP) لنمذجة وحل مشكلة البائع المتجول.
الشرح: الدالة `MIP_solver` تقوم بتهيئة وحل مشكلة برمجة الأعداد الصحيحة المختلطة، وهي طريقة رياضية شائعة لتمثيل وحل مشاكل التحسين التي تتضمن متغيرات قرار صحيحة.
تلميح: فكر في الدور الأساسي لأي 'solver' في سياق البرمجة الرياضية.
ماذا تمثل المتغيرات الثنائية `x[i, j]` التي يتم إنشاؤها بواسطة `solver.add_var(var_type=BINARY)`؟
الإجابة: تمثل المتغيرات الثنائية `x[i, j]` ما إذا كان الانتقال (المسار) من الموقع `i` إلى الموقع `j` مدرجاً في المسار النهائي للبائع المتجول أم لا. إذا كانت قيمتها 1، فهذا يعني أن الانتقال `i->j` جزء من المسار، وإذا كانت 0، فهو ليس كذلك.
الشرح: المتغيرات الثنائية (Binary) تكون قيمتها إما 0 أو 1، مما يجعلها مثالية لتمثيل القرارات التي تتطلب الاختيار بين خيارين، مثل تضمين أو عدم تضمين انتقال معين في مسار.
تلميح: ما هو نوع المتغير الذي تم تحديده؟ وكيف يرتبط ذلك باتخاذ قرار حول وجود انتقال معين في المسار؟
اشرح دالة الهدف `solver.objective = xsum(dist_matrix[i, j] * x[i][j] for i, j in transitions)`.
الإجابة: تهدف هذه الدالة إلى تقليل المسافة الكلية للمسار. يتم ذلك بضرب مصفوفة المسافات (`dist_matrix`) بين المواقع في المتغيرات الثنائية التي تحدد ما إذا كان الانتقال مستخدماً في المسار. ثم يتم جمع كل هذه القيم لتمثيل المسافة الإجمالية.
الشرح: الهدف هو إيجاد أقصر مسار ممكن يزور كل موقع مرة واحدة ويعود إلى نقطة البداية. ضرب المسافة بين موقعين `i` و `j` بعدد مرات استخدام هذا الانتقال (وهو ما يمثله `x[i][j]`) ثم جمع هذه النتائج يحقق ذلك.
تلميح: ما هو الهدف الأساسي لمشكلة البائع المتجول؟ وكيف يمكن التعبير عن المسافة الإجمالية باستخدام المتغيرات؟
ما الغرض من القيود التالية: `solver += xsum(x[i][j] for j in location_ids - {i}) == 1` و `solver += xsum(x[i][j] for j in location_ids - {i}) == 1` لكل موقع `i`؟
الإجابة: هذه القيود تضمن أن كل موقع `i` يتم دخوله مرة واحدة بالضبط والخروج منه مرة واحدة بالضبط. القيد الأول يضمن أن هناك انتقالاً واحداً فقط يخرج من الموقع `i` (Arrival Constraint)، والقيد الثاني يضمن أن هناك انتقالاً واحداً فقط يدخل إلى الموقع `i` (Depart Constraint).
الشرح: في المسار الأمثل، يجب أن يصل البائع إلى كل مدينة مرة واحدة فقط ويغادر منها مرة واحدة فقط. هذه القيود الرياضية تفرض هذه الشروط على نموذج الحل.
تلميح: فكر في طبيعة المسار المطلوب في مشكلة البائع المتجول - كيف يجب أن يكون لكل موقع؟
ما الدور الذي تلعبه المتغيرات الثنائية `y[i]` في نموذج حل مشكلة البائع المتجول؟
الإجابة: تُستخدم المتغيرات الثنائية `y[i]` لتمثيل ترتيب زيارة المواقع (باستثناء نقطة البداية/النهاية `startstop`) ولمنع تكون الدورات الفرعية (subtours). إذا تم استخدام `y[i]`، فإنه يحدد أن الموقع `i` جزء من المسار الرئيسي.
الشرح: بدون قيود منع الدورات الفرعية، قد تجد الخوارزمية حلاً يتكون من مسارات متعددة قصيرة بدلاً من مسار واحد طويل. المتغيرات `y[i]` و القيود المرتبطة بها تمنع تكون هذه الدورات الفرعية غير المرغوبة.
تلميح: ما هي المشكلة الشائعة التي قد تنشأ في نماذج البائع المتجول غير المكتملة، وكيف يمكن لمتغيرات إضافية المساعدة في حلها؟