เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

การจัดสรรทรัพยากร

ทำได้ดีมาก ถึงเวลาแก้โจทย์ถัดไปแล้ว

ผู้จัดการต้องการจัดสรรงาน 120 ชิ้นให้กับวิศวกรซอฟต์แวร์ 3 คน ได้แก่ Senior (S), Junior (J) และ Intern (I) โดยมีเป้าหมายเพื่อลดต้นทุนให้น้อยที่สุด

นักศึกษาฝึกงานต้องผ่านการฝึกอบรมก่อนเริ่มงาน ซึ่งมีค่าใช้จ่าย $500 ต้นทุนต่องาน 1 ชิ้น คือ c = [30, 40, 5] ตามลำดับ

\(x\) แทนจำนวนงานที่ได้รับมอบหมาย และ \(o\) คือตัวแปรไบนารีที่ระบุว่านักศึกษาฝึกงานได้รับการฝึกอบรมหรือไม่ ต้นทุนรวมคือ

\(TC = 30x_S+40x_J+(5x_I+500)o\)

ใช้วิธี BigM เพื่อทำให้ปัญหานี้เป็นเชิงเส้น (linearize) โดยนำตัวแปรใหม่ \(z\) มาใช้:

\(z = (5x_I+500)o\)

\(-oM\leq z \leq oM\)

\(-(1-o)M \leq z- (5x_I+500)o \leq (1-o)M\)

pulp รวมถึง model, พารามิเตอร์ c, M และ names และตัวแปร x, z, o ถูกนำเข้าให้แล้ว

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

การหาค่าที่เหมาะสมที่สุดใน Python เบื้องต้น

ดูคอร์ส

คำแนะนำการฝึกหัด

  • กำหนด objective function โดยแทนที่ส่วนหนึ่งของสูตรด้วย z
  • กำหนด constraints โดยระบุ index ของ Intern ให้ถูกต้อง

แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ

ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์

# Define the objective
model += c[0]*x[0] + c[1]*x[1] + ____

# Define the constraints
model += -o * M <= z
model += z <= o * M
model += -(1-o) * M <= z - (c[___]*x[____] + 500)
model += z - (c[____]*x[____] + 500) <= (1-o) * M
model += lpSum(x) >= 120

status = model.solve()
print(f"{'Optimal found' if status == 1 else 'Ignore solution'}")
for i in range(len(c)):
    print(f"{names[i]} was assigned {x[i].varValue:.0f}")
แก้ไขและรันโค้ด