Моя модель CPLEX не решается в выводе, я получаю некоторые противоречивые неравенства. - PullRequest
0 голосов
/ 05 октября 2018

Ниже приведен мой код CPLEX, в котором я пытаюсь реализовать проблему ценообразования в облачных вычислениях ( ссылка на бумаге ). Это проблема максимизации с целью максимизации доходов поставщика облачных услуг. Другая проблема, с которой я сталкиваюсь, заключается в том, что я не могу добавить константу к целевой функции.

package cplex;
import java.util.Arrays;
import java.util.Random;

import ilog.concert.*;
import ilog.cplex.*;
import java.util.*;
class providers
{
    double price;
     int available;
}

public class Main {
    public static void main(String args[]) {

        double cin=6.951; //lumped cost
        double phi=0.01;  //difference b/w customer cost and in-source cost
        int K=20,N=100;   //K is no pf service provider in federation
        //N is total number of customers
        int uin=5; //average user request for instance in
        int pin=5;//average provider request for instance in

        Random rand=new Random();
        //declare k-1 providers;
        providers[] pi=new providers[K-1];

        double umin; // lower bound of price proposed to users
        umin=(cin+phi*(K-1)*pin)/(N*uin+(K-1)*pin);//using theorem 4.1


        double[] insrcprices=new double[K-1]; //insourcing prices proposed by other providers at previous hour
        System.out.println("insourcing prices proposed by other providers\n");
        for(int i=0;i<K-1;i++)
        {
            pi[i]=new providers();
            double temp=rand.nextInt()%100+1;
            insrcprices[i]=(temp<0?-(temp/1000):temp/1000);
            pi[i].price=insrcprices[i]+phi;
            System.out.print(insrcprices[i]+" ");
        }

        Arrays.sort(insrcprices);

        //find minimum price satisfying the constraint
        double ustr=0.0;
        for(int i=0;i<insrcprices.length;i++)
        {
            if(insrcprices[i]>umin)
            {
                ustr=insrcprices[i]+phi;
                break;
            }
        }
        System.out.println("\nlower bound of price proposed to users is:");
        System.out.printf("%.3f",umin);
        System.out.println("\nupper bound of price proposed to end users is ");
        System.out.printf("%.3f",ustr);
        double uSelected=umin+phi+(ustr+-umin-phi)*new Random().nextDouble();
        System.out.println("\nthe selected price proposed to users is ");
        System.out.printf("%.3f",uSelected);

        double uInSelected=uSelected=0.01;

        int[] bj=new int[K-1];
        System.out.println("the amount of available resources\n");
        for(int i=0;i<K-1;i++)
        {

            bj[i]=new Random().nextInt(20-0+1)+0;
            pi[i].available=bj[i];
            System.out.print(bj[i]+" ");
        }
        Arrays.sort(bj);
        System.out.println("K-1 providers are\n");
        for(int i=0;i<K-1;i++)
        {
            System.out.println("provider "+i+"price = "+pi[i].price+" available resources = "+pi[i].available);
        }







        model1(uInSelected,uSelected,pi,K);

    }
    public static void model1(double uij,double uii,providers[] pi,int K)
    {
        try{
            double Ro=100.0;
            double dp=10; //provider request
            double du=100; // user request
            IloNumVar[] xji=new IloNumVar[K-1];
            int yil=new Random().nextInt(20-0+1)+0;
            double c=0.005;//cost per hour
            IloCplex cplex=new IloCplex();
            //variable
            IloNumVar xii=cplex.numVar(0, Integer.MAX_VALUE,"x");
            IloNumVar xij=cplex.numVar(0, Integer.MAX_VALUE,"y");

            for(int i=0;i<K-1;i++)
            {
                 xji[i]=cplex.numVar(0,Double.MAX_VALUE,"xji"+i);
            }

            //expressions
            IloLinearNumExpr objective=cplex.linearNumExpr();
            objective.addTerm(uii, xii);
            objective.addTerm(uij, xij);

            for(int i=0;i<K-1;i++)
            {
                objective.addTerm(uii-pi[i].price, xji[i]);
            }

            //objective.addTerm(0.12, x);
            //objective.addTerm(0.15, y);

            //define objective
            cplex.addMaximize(objective);

            //define constraints
            IloLinearNumExpr outsrc=cplex.linearNumExpr();
            for(int i=0;i<K-1;i++)
            {
                outsrc.addTerm(1.0, xji[i]);
            }
            outsrc.addTerm(1.0,xii);
            cplex.addEq(outsrc, du); 
            cplex.addLe(xij,dp);
            cplex.addLe(outsrc, yil);
            cplex.addGe(cplex.sum(objective,-(c*yil)),Ro);
            for(int i=0;i<K-1;i++)
            {
                cplex.addLe(xji[i],pi[i].available);
            }


            /*cplex.addGe(cplex.sum(cplex.prod(60, x),cplex.prod(60, y)), 300); // addGe(LHS,RHS) of inequality
            cplex.addGe(cplex.sum(cplex.prod(12, x),cplex.prod(6, y)), 36);
            cplex.addGe(cplex.sum(cplex.prod(10, x),cplex.prod(30, y)), 90);*/

            //solve
            if(cplex.solve())
            {
                double x=cplex.getBestObjValue();
                System.out.println("model solved objective = "+(x-c*yil));
                System.out.println("model solved objective = "+(int)cplex.getValue(xii));
                System.out.println("model solved objective = "+(int)cplex.getValue(xij));
            }
            else
            {
                System.out.println("some thing went wrong!!!\n model not solved");
            }




        }
        catch(IloException e)
        {
            e.printStackTrace();
        }
    }

}

следующий вывод, который я получаю:

цены на инсорсинг, предложенные другими поставщиками

0.047 0.069 0.061 0.025 0.078 0.028 0.048 0.059 0.057 0.097 0.021 0.027 0.018 0.092 0.094 0.025 0.092 0.092 0.034 
lower bound of price proposed to users is:
0.013
upper bound of price proposed to end users is 
0.028
the selected price proposed to users is 
0.026the amount of available resources

4 1 3 17 18 14 7 10 14 4 13 20 6 20 14 12 16 16 16 K-1 providers are

provider 0price = 0.057 available resources = 4
provider 1price = 0.079 available resources = 1
provider 2price = 0.071 available resources = 3
provider 3price = 0.035 available resources = 17
provider 4price = 0.088 available resources = 18
provider 5price = 0.038 available resources = 14
provider 6price = 0.058 available resources = 7
provider 7price = 0.06899999999999999 available resources = 10
provider 8price = 0.067 available resources = 14
provider 9price = 0.107 available resources = 4
provider 10price = 0.031 available resources = 13
provider 11price = 0.037 available resources = 20
provider 12price = 0.027999999999999997 available resources = 6
provider 13price = 0.102 available resources = 20
provider 14price = 0.104 available resources = 14
provider 15price = 0.035 available resources = 12
provider 16price = 0.102 available resources = 16
provider 17price = 0.102 available resources = 16
provider 18price = 0.044000000000000004 available resources = 16
Constraints 'c1' and 'c3' are inconsistent.
Presolve time = 0.00 sec. (0.01 ticks)
some thing went wrong!!!
 model not solved

Я не могу увидеть ошибку. Я новичок в cplex.

...