Используйте tupla (i, j) вместо одной переменной (j) - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу создать переменную tupla для этой модели p (i, j) вместо только переменной p (j).Я должен изменить это здесь и на переменные, которые влияют на это.

Пример текущей модели

Код

def buildBaseModel():
    global nVars,nClauses,kbRulesLit,kbRulesProbMin,kbRulesProbMax,kbRulesCard,Q
    # Create Model
    m = pulp.LpProblem("Profit maximising problem",pulp.LpMaximize)

    nPsatVars = 2 ** nVars

    # Create variables p_i -->HERE SHOULD BE p[i]_[j]
    p = {}    
    for j in range(nPsatVars):
        p[j]=pulp.LpVariable(lowBound=0,cat='Continuous',name='p_'+str(j))

    #m += sum([p[j] for j in range(nPsatVars)]) --> HERE CHANGE OBJECTIVE FUNCTION

    # Create variables pai_i
    pai = {}
    for j in range(1,Q + 1):
        #pai[j] = kbRulesProb[j]
        pai[j]= pulp.LpVariable(lowBound=kbRulesProbMin[j],upBound=kbRulesProbMax[j],cat='Continuous',name='pai_'+str(j))        
    for j in range(Q + 1,nClauses + 1):
        pai[j]= pulp.LpVariable(lowBound=0,cat='Continuous',name='pai_'+str(j))

    # Create variables qp_i
    qp = {}
    for j in range(1,Q+1): #not first rule
        qp[j]=pulp.LpVariable(lowBound=0,cat='Continuous',name='qp_'+str(j))

    # Create variables qn_i
    qn = {}
    for j in range(1,Q+1): #not first rule
        qn[j]=pulp.LpVariable(lowBound=0,cat='Continuous',name='qn_'+str(j))

    #construct the matrix A
    A=np.array([[1] * nPsatVars] * (nClauses + 1))#0
    x = {}
    for j in range(nVars):
        x[j] = 0
    for i in range(1,nClauses + 1):
        for j in range(nPsatVars):
            r = j
            #the value of x is the assignment of the Var,such as [0,1,1,0,0,0]
            for k in range(nVars):
                x[k] = (r >> k)%2
            t = 0
            for k in kbRulesLit[i]:
                if k == 0 and x[0] == 1:
                    t = 1
                if k > 0 and x[k] == 1:
                    t = 1
                if k < 0 and x[-k] == 0:
                    t = 1
            if t == 1:
                A[i][j] = 0

    #constrict
        m+=sum([p[j] for j in range(nPsatVars)])== 1.0 

        #constrict
        for i in range(1,Q + 1):
            m+=sum([p[j]*A[i][j] for j in range(nPsatVars)])-qp[i] <= kbRulesProbMax[i]

        for i in range(1,Q + 1):
            m+=sum([p[j]*A[i][j] for j in range(nPsatVars)])+qn[i] >= kbRulesProbMin[i]

        for i in range(Q + 1,nClauses + 1):
            m+=sum([p[j] * A[i][j] for j in range(nPsatVars)]) - pai[i] == 0 

    #USE GUROBI
    m.solve(pulp.GUROBI())
    pulp.LpStatus[m.status]

    if(m.status==-1):
        print("there is no solution for the CONDSAT problem")
    else :
        print("find solution\n")

    varsdict = {}
    for v in m.variables():
        print(v.name,"=", v.varValue)
    m.writeLP('c.lp')

Окончательная модельчто код должен делать Так что в окончательной модели у нас будет p_i_j вместо p_j, как этот код генерирует сегодня.

помимо этого, мне нужна помощь, чтобы изменить целевую функцию модели, чтобы добавить цельфункция, которая максимизирует сумму всех переменных p (i, j) (что необходимо сделать после первого изменения)

1 Ответ

0 голосов
/ 05 апреля 2019

Добро пожаловать в СО!Я просто реализовал модель так, как нашел (не пытался понять).

Status: Unbounded
n_1_1 = 0.0
n_1_2 = 0.0
n_1_3 = -0.14
n_2_1 = 0.0
n_2_2 = 0.0
n_2_3 = -0.41
p_1_0 = 0.09
p_1_1 = 0.06
p_1_2 = 0.0
p_1_3 = 0.14
p_1_4 = 0.0
p_1_5 = 0.71
p_1_6 = 0.0
p_1_7 = 0.0
p_2_0 = 0.155
p_2_1 = 0.085
p_2_2 = 0.0
p_2_3 = 0.41
p_2_4 = 0.0
p_2_5 = 0.35
p_2_6 = 0.0
p_2_7 = 0.0
objective= 0.0
...