예제 #1
0
def Model_Test():
    n = 4
    Cd = 10
    Cr = 6
    P = 0.5
    budget =23
    K = 0


    d_monitor={ (0,0):1, (0,1): 1, (0,2): 0, (0,3): 0,
                (1,0):0, (1,1): 1, (1,2): 0, (1,3): 0,
                (2,0):0, (2,1): 0, (2,2): 1, (2,3): 1,
                (3,0):0, (3,1): 0, (3,2): 1, (3,3): 0}

    v_commu ={ (0,0):1, (0,1): 0, (0,2): 0, (0,3): 0,#无线通讯
               (1,0):0, (1,1): 1, (1,2): 1, (1,3): 0,
               (2,0):0, (2,1): 0, (2,2): 1, (2,3): 1,
               (3,0):0, (3,1): 1, (3,2): 0, (3,3): 1}

    edges = [(1,2)]  #无线通讯的矩阵中的边
    edges = tuplelist(edges)
    #print "edges:", edges
    #print "d_monitor: ", d_monitor
    #print "v_commu: ", v_commu
    Min_pollution(P,n,Cd,Cr,budget,d_monitor,v_commu,edges)
    My_algo(P,n,Cd,Cr,budget,d_monitor,v_commu,edges)
예제 #2
0
    def __Simulate(self, d_r):
        # define the model
        model = Model('evaluation_problem')
        model.setParam('OutputFlag', 0)
        model.modelSense = GRB.MINIMIZE

        # decision variables
        X = model.addVars(tuplelist(self.roads_Z), vtype=GRB.CONTINUOUS, lb=0.0, name='X')

        # objective function
        objFunc_penal = sum(d_r) - X.sum()
        model.setObjective(objFunc_penal)

        # constraints
        model.addConstrs(X.sum('*', j) <= d_r[j] for j in range(self.n))
        model.addConstrs(X.sum(i, '*') <= self.I[i] for i in range(self.m))

        # solve
        model.optimize()

        # record
        return {'d_r': d_r, 'X': {f'{r}': X[r].X for r in self.roads_Z}}
예제 #3
0
    1: 200,
    2: 0,
    3: 0,
    4: 0,
    5: 0,
    6: 0,
    7: 300,
    8: 0,
    9: 0,
    10: 500,
    11: 0,
    12: 200,
    13: 0,
    14: 0,
    15: 0,
    16: 0,
    17: 1000,
    18: 1200
}

precedences = tuplelist([(9, 1), (9, 2), (9, 3), (10, 2), (10, 3), (10, 4),
                         (11, 3), (11, 4), (11, 5), (12, 4), (12, 5), (12, 6),
                         (13, 5), (13, 6), (13, 7), (14, 6), (14, 7), (14, 8),
                         (15, 9), (15, 10), (15, 11), (16, 10), (16, 11),
                         (16, 12), (17, 11), (17, 12), (17, 13), (18, 12),
                         (18, 13), (18, 14)])

p = UraniumMineProblem(blocks, costs, values, precedences)
m = UraniumMineModel(p)
m.solve()
m.printSolution()
예제 #4
0
def _optimize(
    families: Iterable[Family],
    days: Iterable[Day],
    family_index: Mapping[FamilyID, Family],
    mip_start: Optional[Assignments],
) -> Solution:
    with gurobi.model("santa-19") as model:

        assignment_vars = model.addVars(
            tuplelist((family.id, family_choice) for family in families
                      for family_choice in family.choices),
            name="x",
            vtype=GRB.BINARY,
        )
        occupancy_vars = model.addVars(
            tuplelist((occupancy, day) for day in days
                      for occupancy in _FEASIBLE_OCCUPANCIES),
            name="delta",
            vtype=GRB.BINARY,
        )
        occupancy_pairs = {(o, o_p, d): accounting_cost(o, o_p)
                           for o in _FEASIBLE_OCCUPANCIES
                           for o_p in _FEASIBLE_OCCUPANCIES for d in days}
        occupancy_pair_vars = model.addVars(occupancy_pairs.keys(),
                                            name="phi",
                                            lb=0,
                                            ub=1)
        logger.info("Created variables")

        model.addConstrs(
            (quicksum(assignment_vars[(family_id, family_choice)]
                      for family_choice in family_index[family_id].choices)
             == 1 for family_id in family_index.keys()),
            name="assg",
        )
        model.addConstrs((occupancy_vars.sum("*", day) == 1 for day in days),
                         name="occ_c")
        model.addConstrs(
            (quicksum(
                assignment_vars.get((family.id, day), 0) *
                family.number_of_members for family in families) == quicksum(
                    occupancy_vars[(occupancy, day)] * occupancy
                    for occupancy in _FEASIBLE_OCCUPANCIES) for day in days),
            name="occ",
        )

        n_days = len(list(days))
        model.addConstrs(
            (occupancy_pair_vars.sum(occupancy, "*", d)
             == occupancy_vars[(occupancy, d)]
             for occupancy in _FEASIBLE_OCCUPANCIES for d in days),
            name="occ_l_1",
        )

        model.addConstrs(
            (occupancy_pair_vars.sum("*", occupancy, d + 1)
             == occupancy_vars[(occupancy, d + 1)]
             for occupancy in _FEASIBLE_OCCUPANCIES
             for d in days if d + 1 < n_days),
            name="occ_l_2",
        )

        logger.info("Set constraints")

        pref_cost_expr = quicksum(
            assignment_vars[(family.id, family_choice)] * preference_cost(
                family_choice, family.choice_index, family.number_of_members)
            for family in families for family_choice in family.choices)
        accounting_cost_expr = quicksum(
            occupancy_vars.sum(pair[0], pair[1], "*") * cost
            for pair, cost in occupancy_pairs.items())

        model.setObjective(pref_cost_expr + accounting_cost_expr,
                           sense=GRB.MINIMIZE)
        logger.info("Set objective")

        if mip_start:
            for family_id, assigned_day in mip_start.items():
                v = assignment_vars.get((family_id, assigned_day), None)
                if v:
                    v.start = 1

        model.optimize()

        if model.status == GRB.INFEASIBLE:
            model.computeIIS()
            model.write("conflict.lp")
            raise Exception("Infeasible model.")
        else:
            assignments = {
                k[0]: k[1]
                for k, v in assignment_vars.items() if v.X > 0.5
            }
            model.write("sol.sol")
            return Solution.from_assignments(assignments, days, family_index)
예제 #5
0
def SensingRange(nodeNum, len, wid, Cost_List, CalcTime_List, Budget, K ,pop_size, max_gen):
    Cd = 10
    Cr = 6
    P = 1
    length = len
    width = wid
    Nodes = generateNodes(length, width, nodeNum)   # 随机添加结点
    ####初始化d_monitor,即dij; 具体地通过设定时间阈值Time,随机生成i->j和j->i之间的传染时间,time_ij和time_ji,#####
    # 比较它们j与Time, 进而初始化d_monitor
    d_monitor = {}
    # Velocity = 4  # 米/秒    直接初始化时间,不用“距离/速度”来求得,因为那样既复杂也不不满足实际情况(i到j和j到i的传染时间应该不同)
    Time = 30     # 秒
    num = 0  #测试用
    for i in range(nodeNum):
        for j in range(nodeNum):
            if(i==j):
                d_monitor[i,j] = 1
            else:
                time_ij = random.uniform(1, 120)  #在threshold_Time取range(10,120,10),随机生成的时间time_ij则要在(1,120)之间随机选一个数
                if(time_ij<=Time):
                    d_monitor[i,j] = 1
                    num += 1
                else:
                    d_monitor[i,j] = 0
    # print  "d_monitor==1的数目(除<i,i>):", num
    print  "d_monitor:", d_monitor
    #####初始化水管网的边,即结点间的水管#####
    edges = []
    Comm_Dist = length / math.sqrt(nodeNum)#米,即Communication_Distance,表示sensor间通讯距离限制
    for i in range(nodeNum):
        for j in range(nodeNum):
            distance_ij = Nodes[i].calDistance(Nodes[j])
            if(distance_ij<=Comm_Dist and i != j):
                edges.append((i,j))
    # print "edges:", edges
    tupl_edges = tuplelist(edges)
    #####根据edges矩阵生成v_commu的值,v_commu[i,j]表示i与j的物理可达,即i一定可以通讯到j,只要它们之间的结点布置了sensor,因为这些结点都能在通讯范围内#####
    #例如,v_commu[0,3]=1代表0能通讯到3;注意v_commu[a,a]=0,除非存在b使(a,b)在edges中 v_commu[a,a]才=1,此时a->b->a通讯
    v_commu = {}
    # v_commu = {(0,0):1, (1,1):1, (2,2):1, (3,3):1, (0,1):0, (1,0):0, (0,2):1, (2,0):1, (0,3):0, (3,0):0, (1,2):0,
    #            (2,1):0, (1,3):0, (3,1):0, (2,3):0, (3,2):0}

    # for i,j in v_commu:
    #     if v_commu[i,j]==1:
    #         print "v_commu[i,j]", (i,j)
    allLink_edges = edges       #先得到任意两点间可否通讯的图,存在一个list中;然后再转换成v_commu字典形式
    for i in range(nodeNum):
        for j in range(nodeNum):
            if (i,j) in allLink_edges:      #即表示i到j有通讯
                for k in range(nodeNum):
                    if (k,j) in allLink_edges and k!=i:
                        allLink_edges.append((i,k))
    for i in range(nodeNum):                #判断一下对角线是否设为1
        for j in range(nodeNum):
            if (i,j) in allLink_edges:      #说明表示i到有向外的通讯,不是孤立点,则自己能回到自己
                allLink_edges.append((i,i))
    # print "allLink_edges", allLink_edges
    allLink_edges = list(set(allLink_edges))  #去除list中重复的
    # print "allLink_edges", allLink_edges

    for i in range(nodeNum):    #列表allLink_edges转换为字典v_commu表示
        for j in range(nodeNum):
            if (i,j) in allLink_edges:
                v_commu[i,j]=1
            else:
                v_commu[i,j]=0
    print "v_commu", v_commu

    currentTime_1 = getTime()
    #Gurobi_Cost = Min_pollution(P,nodeNum,Cd,Cr,Budget,d_monitor,v_commu,tupl_edges)
    Gurobi_Cost = 0
    currentTime_2 = getTime()
    #TwoPhase_Cost = My_algo(P,nodeNum,Cd,Cr,Budget,d_monitor,v_commu,edges)
    TwoPhase_Cost = 0
    currentTime_3 = getTime()
    Genetic_Cost = Genetic_Algo_V(P,nodeNum,Cd,Cr,Budget,d_monitor,v_commu,edges, pop_size, max_gen)
    currentTime_4 = getTime()

    Time_Gurobi_Cost = currentTime_2 - currentTime_1
    Time_MyAlgo_Cost = currentTime_3 - currentTime_2
    Time_Genetic_Cost = currentTime_4 - currentTime_3
    Cost_List[0] = Gurobi_Cost
    Cost_List[1] = TwoPhase_Cost
    Cost_List[2] = Genetic_Cost

    CalcTime_List[0] = Time_Gurobi_Cost
    CalcTime_List[1] = Time_MyAlgo_Cost
    CalcTime_List[2] = Time_Genetic_Cost
예제 #6
0
from solutions.stadium.stadium_problem import StadiumConstructionProblem
from solutions.stadium.stadium_model import StadiumConstructionModel
# PROBLEM DATA
tasks = [i for i in range(1,18+1)]
durations = {1: 2,
            2: 16,
            3: 9,
            4: 8,
            5: 10,
            6: 6,
            7: 2,
            8: 2,
            9: 9,
            10: 5,
            11: 3,
            12: 2,
            13: 1,
            14: 7,
            15: 4,
            16: 3,
            17: 9,
            18: 1}

precedences = tuplelist([(2,1),(3,2),(4,2),(5,3),(6,4),(6,5),(7,4),(8,6),(9,4),(9,6),(10,4),(11,6),(12,9),(13,7),(14,2),
                         (15,4),(15,14),(16,8), (16,11),(16,14),(15,11),(17,12),(18,17)])

p = StadiumConstructionProblem(tasks,durations,precedences)
m = StadiumConstructionModel(p)

m.solve()
m.printSolution()