示例#1
0
    public static void SolveInstance(RPQ_Instance instance)
    {
        Solver solver = Solver.CreateSolver("SimpleMipProgram",
                                            "CBC_MIXED_INTEGER_PROGRAMMING");
        //maksymalnawartosczmiennych,liczonazduzaprzesada
        int variablesMaxValue = 0;

        foreach (RPQ_Job job in instance.jobs)
        {
            variablesMaxValue += job.r + job.p + job.q;
        }
        //zmienne:
        //alfypotrzebnedoustaleniakolejnosci:
        var alfas = solver.MakeIntVarMatrix(instance.jobs.Count,
                                            instance.jobs.Count, 0, 1);
        //czasyrozpoczynaniaposzczegolnychzadan:
        var starts = solver.MakeIntVarArray(instance.jobs.Count,
                                            0, variablesMaxValue);
        //cmax:
        var cmax = solver.MakeIntVar(0, variablesMaxValue, "cmax");

        //ograniczenia:
        //kazdezzadanmusizostacnajpierwprzygotowane:
        foreach (RPQ_Job job in instance.jobs)
        {
            solver.Add(starts[job.id] >= job.r);
        }
        //Cmaxmusibycmniejszyodwszystkichczasowzakonczen(zq):
        foreach (RPQ_Job job in instance.jobs)
        {
            solver.Add(cmax >= starts[job.id] + job.p + job.q);
        }
        //ogariczeniaodpowiadajacezakolejnoscwykonywaniazadan:
        for (int i = 0; i < instance.jobs.Count; i++)
        {
            for (int j = i + 1; j < instance.jobs.Count; j++)
            {
                var job1 = instance.jobs[i];
                var job2 = instance.jobs[j];
                solver.Add(starts[job1.id] + job1.p <= starts[job2.id] +
                           alfas[job1.id, job2.id] * variablesMaxValue);
                solver.Add(starts[job2.id] + job2.p <= starts[job1.id] +
                           alfas[job2.id, job1.id] * variablesMaxValue);
                solver.Add(alfas[job1.id, job2.id] + alfas[job2.id, job1.id] == 1);
            }
        }
        solver.Minimize(cmax);
        Solver.ResultStatus resultStatus = solver.Solve();
        // Console.WriteLine(solver.);
        if (resultStatus != Solver.ResultStatus.OPTIMAL)
        {
            Console.WriteLine("Solver didn’t find optimal solution!");
        }
        Console.WriteLine("Objective value=" + solver.Objective().Value());
    }
示例#2
0
    //private static void RunLinearProgrammingExample(String solverType)
    //{
    //    Solver solver = Solver.CreateSolver("IntegerProgramming", solverType);
    //    Create the variables x and y.
    //    Variable x = solver.MakeNumVar(0.0, 1.0, "x");
    //    Variable y = solver.MakeNumVar(0.0, 2.0, "y");
    //    Create the objective function, x +y.
    //    Objective objective = solver.Objective();
    //    objective.SetCoefficient(x, 1);
    //    objective.SetCoefficient(y, 1);
    //    objective.SetMaximization();
    //    Call the solver and display the results.
    //   solver.Solve();
    //    Console.WriteLine("Solution:");
    //    Console.WriteLine("x = " + x.SolutionValue());
    //    Console.WriteLine("y = " + y.SolutionValue());
    //}

    static void Main()
    {
        //RunLinearProgrammingExample("GLOP_LINEAR_PROGRAMMING");
        DateTime start;
        DateTime start1;
        DateTime end;
        DateTime end1;



        RPQ_Instance sth   = new RPQ_Instance();
        RPQ_Job      temp  = new RPQ_Job();
        RPQ_Job      temp1 = new RPQ_Job();
        RPQ_Job      temp2 = new RPQ_Job();
        RPQ_Job      temp3 = new RPQ_Job();


        temp.id = 0;
        temp.r  = 0;
        temp.p  = 27;
        temp.q  = 78;
        sth.jobs.Add(temp);

        temp1.id = 1;
        temp1.r  = 140;
        temp1.p  = 7;
        temp1.q  = 67;
        sth.jobs.Add(temp1);
        temp2.id = 2;
        temp2.r  = 14;
        temp2.p  = 36;
        temp2.q  = 54;
        sth.jobs.Add(temp2);
        temp3.id = 3;
        temp3.r  = 133;
        temp3.p  = 76;
        temp3.q  = 5;
        sth.jobs.Add(temp3);
        start = DateTime.Now;
        SolveInstance(sth);
        end = DateTime.Now;
        Console.WriteLine(end - start);

        start1 = DateTime.Now;
        SolveInstance1(sth);
        end1 = DateTime.Now;
        Console.WriteLine(end1 - start1);
        Console.ReadKey();
    }
示例#3
0
    public static void SolveInstance1(RPQ_Instance instance)
    {
        CpModel  model  = new CpModel();
        CpSolver solver = new CpSolver();
        //maksymalnawartosczmiennych,liczonazduzaprzesada
        int variablesMaxValue = 0;

        foreach (RPQ_Job job in instance.jobs)
        {
            variablesMaxValue += job.r + job.p + job.q;
        }

        var alfas = new IntVar[instance.jobs.Count, instance.jobs.Count];

        for (int i = 0; i < instance.jobs.Count; i++)
        {
            for (int j = 0; j < instance.jobs.Count; j++)
            {
                alfas[i, j] = model.NewIntVar(0, 1, "alfa" + i + "_" + j);
            }
        }
        var starts = new IntVar[instance.jobs.Count];

        for (int i = 0; i < instance.jobs.Count; i++)
        {
            starts[i] = model.NewIntVar(0, variablesMaxValue, "starts" + i);
        }
        //cmax:
        var cmax = model.NewIntVar(0, variablesMaxValue, "cmax");

        //ograniczenia:
        //kazdezzadanmusizostacnajpierwprzygotowane:
        foreach (RPQ_Job job in instance.jobs)
        {
            model.Add(starts[job.id] >= job.r);
        }
        //Cmaxmusibycmniejszyodwszystkichczasowzakonczen(zq):
        foreach (RPQ_Job job in instance.jobs)
        {
            model.Add(cmax >= starts[job.id] + job.p + job.q);
        }
        //ogariczeniaodpowiadajacezakolejnoscwykonywaniazadan:
        for (int i = 0; i < instance.jobs.Count; i++)
        {
            for (int j = i + 1; j < instance.jobs.Count; j++)
            {
                var job1 = instance.jobs[i];
                var job2 = instance.jobs[j];
                model.Add(starts[job1.id] + job1.p <= starts[job2.id] +
                          alfas[job1.id, job2.id] * variablesMaxValue);
                model.Add(starts[job2.id] + job2.p <= starts[job1.id] +
                          alfas[job2.id, job1.id] * variablesMaxValue);
                model.Add(alfas[job1.id, job2.id] + alfas[job2.id, job1.id] == 1);
            }
        }
        model.Minimize(cmax);
        CpSolverStatus resultStatus = solver.Solve(model);

        //Console.WriteLine(solver.ResponseStats());

        if (resultStatus != CpSolverStatus.Optimal)
        {
            Console.WriteLine("Solver didn’t find optimal solution!");
        }
        Console.WriteLine("Objective value=" + solver.ObjectiveValue);
    }