Having trouble in expressing constraints in Python

Discussion in 'Python' started by varun7rs, Jun 3, 2014.

  1. varun7rs

    varun7rs Guest

    I have a problem in writing a constraint in Python. Firstly, I wrote the code in AMPL and it was working and I'm using Python for the reason that it is more suitable to handle large data. I managed to write the code quite fine except for one constraint(Link Mapping Constraint). I've attached pieces of code from both AMPL and Python. First part of it is the Link Capacity Constraint in AMPl followed by Python. Second part of the code is the Link Mapping Constraint and I wish to write it in a similar fashion. But, I'm not able to proceed with it. I really appreciate your help.

    subject to Link_Capacity_Constraints { (ns1, ns2) in PHY_LINKS}:
    sum {dns in DEMAND} ((f_eN_SGW[dns, ns1, ns2] * (MME_bdw[dns] + IMS_bdw[dns] + PoP_bdw[dns])) + (f_SGW_PGW[dns, ns1, ns2] * PoP_bdw[dns]) + (f_SGW_IMS[dns, ns1, ns2] * IMS_bdw[dns]) + (f_SGW_MME[dns, ns1, ns2] * MME_bdw[dns]) + (f_PGW_PoP[dns, ns1, ns2] * PoP_bdw[dns])) <= capacity_bdw[ns1, ns2];

    for edge in phy_network.edges:
    varNames = []
    varCoeffs = []
    for demand in demands:
    varNames.append("f_eN_SGW_{}_{}_{}".format(demand.demandID,edge.SourceID, edge.DestinationID))
    varCoeffs.append(demand.MME_bdw + demand.IMS_bdw + demand.PoP_bdw )
    varNames.append("f_SGW_PGW_{}_{}_{}".format(demand.demandID, edge.SourceID, edge.DestinationID))
    varNames.append("f_SGW_IMS_{}_{}_{}".format(demand.demandID, edge.SourceID, edge.DestinationID))
    varNames.append("f_SGW_MME_{}_{}_{}".format(demand.demandID, edge.SourceID, edge.DestinationID))
    varNames.append("f_PGW_PoP_{}_{}_{}".format(demand.demandID, edge.SourceID, edge.DestinationID))
    solver.add_constraint(varNames, varCoeffs, "L", edge.capacity_bdw, "Link_Capacity_Constraints{}_{}_{}".format(edge.SourceID, edge.DestinationID, demand.demandID))

    #Link Mapping Constraint
    subject to Link_Mapping_Constraints_1{dns in DEMAND, ns1 in PHY_NODES}: sum{(ns1,w) in PHY_LINKS} (f_eN_SGW[dns, w, ns1] - f_eN_SGW[dns, ns1, w]) =x_eN[dns, ns1] - x_SGW[dns, ns1];
    varun7rs, Jun 3, 2014
    1. Advertisements

  2. Are you trying to implement your own code rather than use an existing
    library from pypi?

    I also observe the gmail address which I'm assuming means google groups.
    If that is the case, would you please use the mailing list
    https://mail.python.org/mailman/listinfo/python-list or read and action
    this https://wiki.python.org/moin/GoogleGroupsPython to prevent us
    seeing double line spacing and single line paragraphs, thanks. If not
    please ignore this paragraph :)
    Mark Lawrence, Jun 3, 2014
    1. Advertisements

  3. No need to assume - the OP's headers show Google Groups injection info.

    Chris Angelico, Jun 3, 2014
  4. varun7rs

    varun7rs Guest

    I borrowed the idea from a previous file which I was working on. I input variables and coefficients as lists and then inturn as matrices to the CPLEX. So, I have a problem with expressing the constraint in Python.
    varun7rs, Jun 3, 2014
  5. varun7rs

    Ian Kelly Guest

    You didn't tell us what aspect of this is confounding you, so I'll
    take a wild stab at it. Looks like you want to iterate over the
    Cartesian product of all the demands and all the nodes, and for each
    such pair generate a constraint by iterating over all the edges that
    have that node as the source. You can do that by iterating over *all*
    the edges and comparing the source node of each one. Or you can
    precompute the edges for each source node and store them in a dict
    mapping each node to the list of edges it is the source of. Then all
    you need to do in the loop is look up the source node in the dict and
    iterate over the retrieved list of edges.
    Ian Kelly, Jun 4, 2014
  6. varun7rs

    varun7rs Guest

    Thanks a lot Ian. Your post helped me understand the problem in a much better way and I've solved the first objective thanks to you but incase of my second objective which is minimize the number of nodes, I have got one of the weirdest looking constraints which I don't know how to express in Python because python basically takes matrices and inputs them into cplex. My constraint is as below. Thsi was what I wrote in AMPL

    minimize phy_nodes: sum {w in PHY_NODES} x_ns[w] ;

    s.t. Phy_nodes_Eq{w in PHY_NODES, dns in DEMAND}:
    x_ns[w] = 1 ==> x_SGW[dns, w] + x_PGW[dns, w] + x_MME[dns, w] + x_IMS[dns, w] + x_PoP[dns, w] >= 1
    else x_SGW[dns, w] + x_PGW[dns, w] + x_MME[dns, w] + x_IMS[dns, w] + x_PoP[dns, w] = 0;
    Could you help me fix this problem?
    varun7rs, Jun 6, 2014
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.