示例#1
0
def get_distribution(N):
    #setting up versus array
    partitions = pg.partition_generator(N, 5, 0, N)
    num = len(partitions)
    cn = [[0] * num for i in range(num)]

    for i in range(num):
        for j in range(num):
            cn[i][j] = sim.get_probability(partitions[j], partitions[i])

    #setting up cvxpy
    dist = [0] * num
    for i in range(num):
        dist[i] = cp.Variable()
    objective = cp.Maximize(
        sum(cp.entr(dist[i])
            for i in range(len(partitions))))  #maximize entropy
    constraint1 = [
        sum([dist[j] * cn[i][j] for j in range(num)]) >= 0.5
        for i in range(num)
    ]
    constraint2 = [dist[i] >= 0 for i in range(num)]
    constraint3 = [sum(dist) == 1]
    problem = cp.Problem(objective, constraint1 + constraint2 + constraint3)
    problem.solve(solver=cp.ECOS)
    #printing distribution
    print("Entropy: ", problem.value)
    print("Ratio entropy/log(n): ", problem.value / np.log(num))
    print("Probability distribution: ")
    distribution_list = []
    for i in range(num):
        temp = (float)(dist[i].value)
        distribution_list.append(
            (max(0, round(temp, DIGITS_PRECISION)), partitions[i]))
    distribution_list.sort(reverse=True)
    counter = 0
    for a in distribution_list:
        counter = counter + 1
        print(counter, ". ", a[1], " p= ", a[0], sep='')

    print("Responses by Player Two --> Player One Probability of Win")
    response_list = []
    for i in range(num):
        temp = 0
        for j in range(num):
            temp = temp + ((float)(dist[j].value)) * cn[i][j]
        response_list.append((round(temp, 3), partitions[i]))

    response_list.sort()
    for a in response_list:
        print(a[1], " ---> ", a[0])
def get_distribution(N):
	partitions=pg.partition_generator(N,5,0,N)
	num=len(partitions)

	cn=[[0]*num for i in range(num)]

	for i in range(num):
		for j in range(num):
			cn[i][j]=sim.get_probability(partitions[j],partitions[i])

	dist=[0]*num
	for i in range(num):
		dist[i]=cp.Variable()

	#original
	#objective=cp.Maximize(sum(dist))
	objective=cp.Minimize(sum(dist))
	constraint1=[sum([dist[j]*cn[i][j] for j in range(num)])>=0.5 for i in range(num)]
	constraint2=[dist[i]>=0 for i in range(num)]
	constraint3=[sum(dist)==1]
	problem=cp.Problem(objective,constraint1+constraint2+constraint3)
	problem.solve()

	optimal_distribution={tuple(partitions[i]): dist[i].value for i in range(num)}

	#print("Distribution: ")
	distribution_list=[]
	for i in range(num):
		temp=(float)(dist[i].value)
		distribution_list.append((round(temp,3),partitions[i]))
		#print(partitions[i]," p",i+1," = ",round(temp,3),sep='')
	distribution_list.sort(reverse=True)
	#for a in distribution_list:
		#print(a[1], " p= ", a[0])



	#print("Responses by Player Two --> Player One Probability of Win")
	response_list=[]
	for i in range(num):
		temp=0
		for j in range(num):
			temp=temp+((float)(dist[j].value))*cn[i][j]
		response_list.append((round(temp,3),partitions[i]))

	response_list.sort()
	#for a in response_list:
		#print(a[1]," ---> ", a[0])

	return optimal_distribution
示例#3
0
def get_distribution(N):
    #setting up versus array
    if ALREADY_CALCULATED == True:
        return dlr.dist_list_reader()
    partitions = pg.partition_generator(N, 5, 0, N)
    #partitions=pg.partition_generator(N,5,0,int(float(2*N/5+1)))
    num = len(partitions)
    cn = [[0] * num for i in range(num)]

    for i in range(num):
        for j in range(num):
            cn[i][j] = sim.get_probability(partitions[j], partitions[i])

    #setting up cvxpy
    dist = [0] * num
    for i in range(num):
        dist[i] = cp.Variable()
    objective = cp.Maximize(
        sum(cp.entr(dist[i])
            for i in range(len(partitions))))  #maximize entropy
    constraint1 = [
        sum([dist[j] * cn[i][j] for j in range(num)]) >= 0.5
        for i in range(num)
    ]
    constraint2 = [dist[i] >= 0 for i in range(num)]
    constraint3 = [sum(dist) == 1]
    problem = cp.Problem(objective, constraint1 + constraint2 + constraint3)
    problem.solve()
    #printing distribution
    print("Probability distribution: ")
    distribution_list = []
    for i in range(num):
        temp = (float)(dist[i].value)
        distribution_list.append(
            (max(0, round(temp, DIGITS_PRECISION)), partitions[i]))
    distribution_list.sort(reverse=True)
    for a in distribution_list:
        print(a[1], " p= ", a[0], sep='')
    return distribution_list
示例#4
0
def get_distribution(N, T):
    partitions = pg.partition_generator(N, 5, 0, N)
    num = len(partitions)

    cn = [[0] * num for i in range(num)]

    for i in range(num):
        for j in range(num):
            cn[i][j] = sim.get_probability(partitions[j], partitions[i])

    dist = [0] * num
    for i in range(num):
        dist[i] = cp.Variable()

    #Maximize probability of being at least X
    tlist = [0] * len(partitions)
    for i in range(len(partitions)):
        counter = 0
        for j in range(5):
            if partitions[i][j] >= T:
                counter = counter + 1
        tlist[i] = (counter / 5)
    objective = cp.Maximize(
        sum(dist[i] * tlist[i] for i in range(len(partitions)))
    )  #maximize chance that more than a certain amount (T) is sent to a front
    constraint1 = [
        sum([dist[j] * cn[i][j] for j in range(num)]) >= 0.5
        for i in range(num)
    ]
    constraint2 = [dist[i] >= 0 for i in range(num)]
    constraint3 = [sum(dist) == 1]
    problem = cp.Problem(objective, constraint1 + constraint2 + constraint3)
    problem.solve()

    optimal_distribution = {
        tuple(partitions[i]): dist[i].value
        for i in range(num)
    }
    ans = (float)(problem.value)
    print("T=", T, "  --> ", round(ans, 3))
    # distribution_list=[]
    # for i in range(num):
    # 	temp=(float)(dist[i].value)
    # 	distribution_list.append((round(temp,3),partitions[i]))
    # distribution_list.sort(reverse=True)
    # for a in distribution_list:
    # 	print(a[1], " p= ", a[0])

    # print("Responses by Player Two --> Player One Probability of Win")
    # response_list=[]
    # for i in range(num):
    # 	temp=0
    # 	for j in range(num):
    # 		temp=temp+((float)(dist[j].value))*cn[i][j]
    # 	response_list.append((round(temp,3),partitions[i]))

    # response_list.sort()
    # for a in response_list:
    # 	print(a[1]," ---> ", a[0])

    return optimal_distribution
示例#5
0
def get_distribution(N, exp, opt):
    partitions = pg.partition_generator(N, 5, 0, N)
    num = len(partitions)

    cn = [[0] * num for i in range(num)]

    for i in range(num):
        for j in range(num):
            cn[i][j] = get_probability(partitions[j], partitions[i])

    dist = [0] * num
    for i in range(num):
        dist[i] = cp.Variable()

    #Maximize probability of being at least X
    one_list = [0] * len(partitions)
    two_list = [0] * len(partitions)
    three_list = [0] * len(partitions)
    four_list = [0] * len(partitions)
    blah_list = [one_list, two_list, three_list, four_list]
    for i in range(len(partitions)):
        for j in range(5):
            for e in range(4):
                blah_list[e][i] = blah_list[e][i] + (partitions[i][j]**
                                                     (e + 1)) / 5
    if opt == 0:
        objective = cp.Minimize(
            sum(dist[i] * blah_list[exp][i] for i in range(len(partitions)))
        )  #maximize chance that more than a certain amount (T) is sent to a front
    elif opt == 1:
        objective = cp.Maximize(
            sum(dist[i] * blah_list[exp][i] for i in range(len(partitions))))
    constraint1 = [
        sum([dist[j] * cn[i][j] for j in range(num)]) >= 0.5
        for i in range(num)
    ]
    constraint2 = [dist[i] >= 0 for i in range(num)]
    constraint3 = [sum(dist) == 1]
    problem = cp.Problem(objective, constraint1 + constraint2 + constraint3)
    problem.solve()

    optimal_distribution = {
        tuple(partitions[i]): dist[i].value
        for i in range(num)
    }
    ans = (float)(problem.value)
    x1 = sum(dist[i].value * blah_list[0][i] for i in range(len(partitions)))
    x2 = sum(dist[i].value * blah_list[1][i] for i in range(len(partitions)))
    x3 = sum(dist[i].value * blah_list[2][i] for i in range(len(partitions)))
    x4 = sum(dist[i].value * blah_list[3][i] for i in range(len(partitions)))
    x1 = round(x1, 3)
    x2 = round(x2, 3)
    x3 = round(x3, 3)
    x4 = round(x4, 3)
    print("Expected value of x: ", x1)
    print("Expected value of x^2: ", x2)
    print("Expected value of x^3: ", x3)
    print("Expected value of x^4: ", x4)
    distribution_list = []
    for i in range(num):
        temp = (float)(dist[i].value)
        if temp > 0.000001:
            distribution_list.append((round(temp, 3), partitions[i]))
    distribution_list.sort(reverse=True)
    for a in distribution_list:
        print(a[1], " p= ", a[0])

    return optimal_distribution
示例#6
0
def solve(N):
    three = []
    for blah in pg.three_front_generator(N):
        if blah[2] <= 2 * N / 5 + 1:
            three.append(blah)
    #three=pg.three_front_generator(N)
    five = pg.partition_generator(N, 5, 0, N)
    num3 = len(three)
    num5 = len(five)
    dist = [0] * num3
    for i in range(num3):
        dist[i] = cp.Variable()
    res = [[0] * num5 for i in range(num3)]
    for i in range(num3):
        for j in range(num5):
            res[i][j] = getResults(three[i], five[j])

    #Settng up the problem
    w = cp.Variable()
    constraintList = []
    constraint1 = [sum(dist) == 1]
    constraint2 = [
        sum(dist[i] * (three[i][0] + three[i][1] + three[i][2])
            for i in range(num3)) == 0.6 * N
    ]
    constraint3 = [dist[i] >= 0 for i in range(num3)]
    constraint4 = [
        sum(res[i][j] * dist[i] for i in range(num3)) >= w for j in range(num5)
    ]
    #E[x]=E[x^2]+4E[xy]
    #constraint5=[sum(dist[i]*(three[i][0]+three[i][1]+three[i][2])/(3*N) for i in range(num3))==sum(dist[i]*(three[i][0]**2+three[i][1]**2+three[i][2]**2)/(3*N**2) for i in range(num3))+4*sum(dist[i]*(three[i][0]*three[i][1]+three[i][0]*three[i][2]+three[i][1]*three[i][2])/(3*N**2) for i in range(num3))]
    constraint5 = [
        getMoment(N, 1, 0, 0, three,
                  dist) == getMoment(N, 2, 0, 0, three, dist) +
        4 * getMoment(N, 1, 1, 0, three, dist)
    ]
    #E[x^2]=E[x^3]+4E[x^2y]
    #constraint6=[sum(dist[i]*(three[i][0]**2+three[i][1]**2+three[i][2]**2)/(3*N**2) for i in range(num3))==sum(dist[i]*(three[i][0]**3+three[i][1]**3+three[i][2]**3)/(3*N**3) for i in range(num3))+4*sum(dist[i]*(three[i][0]**2*three[i][1]+three[i][0]**2*three[i][2]+three[i][1]**2*three[i][0]+three[i][1]**2*three[i][2]+three[i][2]**2*(three[i][0]+three[i][1]))/(6*N**3) for i in range(num3))]
    constraint6 = [
        getMoment(N, 2, 0, 0, three,
                  dist) == getMoment(N, 3, 0, 0, three, dist) +
        4 * getMoment(N, 2, 1, 0, three, dist)
    ]
    #E[xy]=2E[x^2y]+3E[xyz]
    #constraint7=[sum(dist[i]*(three[i][0]*three[i][1]+three[i][0]*three[i][2]+three[i][1]*three[i][2])/(3*N**2) for i in range(num3))==2*sum(dist[i]*(three[i][0]*three[i][1]*(three[i][0]+three[i][1])+three[i][0]*three[i][2]*(three[i][0]+three[i][2])+three[i][1]*three[i][2]*(three[i][1]+three[i][2]))/(6*N**3) for i in range(num3))+3*sum(dist[i]*(three[i][0]*three[i][1]*three[i][2])/N**3 for i in range(num3))]
    constraint7 = [
        getMoment(N, 1, 1, 0, three,
                  dist) == 2 * getMoment(N, 2, 1, 0, three, dist) +
        3 * getMoment(N, 1, 1, 1, three, dist)
    ]

    #E[x^3]=E[x^4]+4E[x^3y]
    #constraint8=[sum(dist[i]*(three[i][0]**3+three[i][1]**3+three[i][2]**3)/(3*N**3) for i in range(num3))==sum(dist[i]*(three[i][0]**4+three[i][1]**4+three[i][2]**4)/(3*N**4) for i in range(num3))+4*sum(dist[i]*(three[i][0]*three[i][1]*(three[i][0]**2+three[i][1]**2)+three[i][0]*three[i][2]*(three[i][0]**2+three[i][2]**2)+three[i][1]*three[i][2]*(three[i][1]**2+three[i][2]**2))/(6*N**4) for i in range(num3))]
    constraint8 = [
        getMoment(N, 3, 0, 0, three,
                  dist) == getMoment(N, 4, 0, 0, three, dist) +
        4 * getMoment(N, 3, 1, 0, three, dist)
    ]
    #E[x^2y]=E[x^3y]+E[x^2y^2]+3E[x^2yz]
    #constraint9=[sum(dist[i]*(three[i][0]*three[i][1]*(three[i][0]+three[i][1])+three[i][0]*three[i][2]*(three[i][0]+three[i][2])+three[i][1]*three[i][2]*(three[i][1]+three[i][2]))/(6*N**3) for i in range(num3))==sum(dist[i]*(three[i][0]*three[i][1]*(three[i][0]**2+three[i][1]**2)+three[i][0]*three[i][2]*(three[i][0]**2+three[i][2]**2)+three[i][1]*three[i][2]*(three[i][1]**2+three[i][2]**2))/(6*N**4) for i in range(num3))+sum(dist[i]*(three[i][0]**2*three[i][1]**2+three[i][1]**2*three[i][2]**2+three[i][0]**2*three[i][2]**2)/(3*N**4) for i in range(num3))+3*sum(dist[i]*(three[i][0]*three[i][1]*three[i][2]*(three[i][0]+three[i][1]+three[i][2]))/(3*N**4) for i in range(num3))]
    constraint9 = [
        getMoment(N, 2, 1, 0, three,
                  dist) == getMoment(N, 3, 1, 0, three, dist) +
        getMoment(N, 2, 2, 0, three, dist) +
        3 * getMoment(N, 2, 1, 1, three, dist)
    ]

    constraintList += constraint1
    constraintList += constraint2
    constraintList += constraint3
    constraintList += constraint4
    constraintList += constraint5
    constraintList += constraint6
    constraintList += constraint7
    constraintList += constraint8
    constraintList += constraint9

    objective = cp.Maximize(w)
    problem = cp.Problem(
        objective, constraintList
    )  #constraint1+constraint2+constraint3+constraint4+constraint5+constraint6+constraint7+constraint8+constraint9)
    problem.solve(solver=cp.ECOS)
    #Printing results
    print(problem.value)
    distribution_list = []
    for i in range(num3):
        temp = (float)(dist[i].value)
        distribution_list.append((max(0, round(temp, 4)), three[i]))
    distribution_list.sort(reverse=True)
    counter = 0
    for a in distribution_list:
        counter = counter + 1
        print(counter, ". ", a[1], " p= ", a[0], sep='')
    CONSTdist = [0] * num3
    for i in range(num3):
        CONSTdist[i] = dist[i].value

    #Consructing a five front distribution that best models this three front distribution
    contributionMatrix = [[0] * num5 for i in range(num3)]
    for i in range(num3):
        for j in range(num5):
            contributionMatrix[i][j] = getContribution(three[i], five[j])
    cn = [[0] * num5 for i in range(num5)]
    for i in range(num5):
        for j in range(num5):
            cn[i][j] = sim.get_probability(five[j], five[i])
    constraintList2 = []
    maxDiff = cp.Variable()
    dist2 = [0] * num5
    for i in range(num5):
        dist2[i] = cp.Variable()

    #old constraints
    Constraint1 = [
        sum([dist2[j] * cn[i][j] for j in range(num5)]) >= 0.5
        for i in range(num5)
    ]
    Constraint2 = [dist2[i] >= 0 for i in range(num5)]
    Constraint3 = [sum(dist2) == 1]

    #new constraints
    #maxDiff should be positive
    Constraint4 = [maxDiff >= 0]
    #maximum absolute difference between a triplet from three front dist and extracted triplet from five front dist is maxDiff
    Constraint5 = [
        sum(dist2[i] * contributionMatrix[j][i]
            for i in range(num5)) - CONSTdist[j] <= maxDiff
        for j in range(num3)
    ]
    Constraint6 = [
        CONSTdist[j] - sum(dist2[i] * contributionMatrix[j][i]
                           for i in range(num5)) <= maxDiff
        for j in range(num3)
    ]

    constraintList2 += Constraint1
    constraintList2 += Constraint2
    constraintList2 += Constraint3
    constraintList2 += Constraint4
    constraintList2 += Constraint5
    constraintList2 += Constraint6
    objective = cp.Minimize(maxDiff)
    problem = cp.Problem(objective, constraintList2)
    problem.solve(solver=cp.ECOS)
    print("maxDiff: ", problem.value)

    #printing data
    print("\nCorresponding Five Front Distribution")
    distribution_list = []
    for i in range(num5):
        temp = (float)(dist2[i].value)
        distribution_list.append((max(0, round(temp, 5)), five[i]))
    distribution_list.sort(reverse=True)
    counter = 0
    for a in distribution_list:
        counter = counter + 1
        print(counter, ". ", a[1], " p= ", a[0], sep='')

    print("\nThree front distribution from above:")
    #sim.extract_three_tuples_from_known(N,distribution_list)
    for i in range(num3):
        val = round(
            sum(dist2[j].value * contributionMatrix[i][j]
                for j in range(num5)), 4)
        print(three[i], " From distribution: ", val, "Should be: ",
              np.round(CONSTdist[i], 4))