线性规划-JobShopSchedulingLP
using System; using Google.OrTools.LinearSolver; namespace JobShopScheduingProblem { /// <summary> /// 线性规划(Linear Programming) /// </summary> public class JobShopSchedulingLP { public static void Solve() { //Console.WriteLine("Google.OrTools version: " + Solver.Version()); // 创建求解器实例,使用默认的求解器 Solver solver = Solver.CreateSolver("GLOP"); // 检查求解器是否有效 if (solver == null) { Console.WriteLine("Unable to create solver."); return; } // 定义决策变量 // 假设我们有两个作业,每个作业有两个任务,分别在两台机器上执行 Variable job1Task1 = solver.MakeIntVar(0, 10, "job1_task1"); Variable job1Task2 = solver.MakeIntVar(0, 10, "job1_task2"); Variable job2Task1 = solver.MakeIntVar(0, 10, "job2_task1"); Variable job2Task2 = solver.MakeIntVar(0, 10, "job2_task2"); // 定义约束条件 // 任务1必须在任务2之前完成 solver.Add(job1Task1 + 2 <= job1Task2); // 假设任务1需要2个时间单位 solver.Add(job2Task1 + 3 <= job2Task2); // 假设任务1需要3个时间单位 // 机器不能同时处理两个任务 solver.Add(job1Task1 + job2Task1 >= 1); // 假设机器1在同一时间只能处理一个任务 solver.Add(job1Task2 + job2Task2 >= 1); // 假设机器2在同一时间只能处理一个任务 // 定义目标函数:最小化最大完成时间 Objective objective = solver.Objective(); objective.SetMinimization(); objective.SetCoefficient(job1Task2, 1); // 假设我们希望最小化第一个作业的完成时间 objective.SetCoefficient(job2Task2, 1); // 假设我们希望最小化第二个作业的完成时间 // 求解问题 Solver.ResultStatus resultStatus = solver.Solve(); // 输出结果 if (resultStatus == Solver.ResultStatus.OPTIMAL) { Console.WriteLine("Optimal solution found:"); Console.WriteLine("Job 1 Task 1 starts at: " + job1Task1.SolutionValue()); Console.WriteLine("Job 1 Task 2 starts at: " + job1Task2.SolutionValue()); Console.WriteLine("Job 2 Task 1 starts at: " + job2Task1.SolutionValue()); Console.WriteLine("Job 2 Task 2 starts at: " + job2Task2.SolutionValue()); Console.WriteLine("Minimum makespan: " + objective.Value()); } else { Console.WriteLine("The problem does not have an optimal solution!"); } } } }