Result.append(mass[i_use2][j]) return Result def get_or_on_neigh(neigh): if len(neigh) == 2: return (mdl.equal(neigh[0],0) | mdl.equal(neigh[1],0)) elif len(neigh) == 3: return (mdl.equal(neigh[0],0) | mdl.equal(neigh[1],0) | mdl.equal(neigh[2],0)) elif len(neigh) == 4: return (mdl.equal(neigh[0],0) | mdl.equal(neigh[1],0) | mdl.equal(neigh[2],0) | mdl.equal(neigh[3],0)) else: raise IndexError('Что-то пошло не так') for i in range(SIZE_X): for j in range(SIZE_Y): neigh = get_neigh(mass_v, i, j) expr = mdl.if_then(mdl.equal(mass_v[i][j],1), get_or_on_neigh(neigh)) mdl.add(expr) def get_neighbours_with_checked(mass, i, j, checked): Y_SIZE = len(mass[0]) X_SIZE = len(mass) Result = [] i_use1 = i + 1 j_use1 = j + 1 i_use2 = i - 1 j_use2 = j - 1 if i - 1 < 0: i_use2 = i + 1 if i + 1 >= X_SIZE: i_use1 = i - 1 if j + 1 >= Y_SIZE:
for i,c in enumerate(checked): if i ==2: mdl.add(mdl.start_before_start(compositions[c[1]],compositions[c[0]])) else: mdl.add(mdl.start_before_start(compositions[c[0]],compositions[c[1]])) ENDS = [] STARTS = [] WAITNESS=[] for k in range(numplayers): for j in range(numcompositions): print(players_compositions[k][j]) #print(mdl.name_of(songs[k][j])) ENDS.append(mdl.end_of(compositions[j])*players_compositions[k][j]) #STARTS.append(mdl.sum([mdl.times(mdl.start_of(songs[k][j] ),mdl.sum([100*mdl.equal(players_compositions[k][j],0),players_compositions[k][j]]) ), 100*mdl.times(mdl.equal(mdl.start_of(songs[k][j]),0),mdl.equal(players_compositions[k][j],0))])) STARTS.append(mdl.times(mdl.start_of(compositions[j] ),1000*mdl.equal(players_compositions[k][j],0)+ players_compositions[k][j])) MAX=mdl.max(ENDS) MIN=mdl.min(STARTS) print(-sum([waittimes[i]*players_compositions[k][i] for i in range(numcompositions)])) WAITNESS.append(mdl.sum([MAX,-MIN,-sum([waittimes[i]*players_compositions[k][i] for i in range(numcompositions)])])) EXPR=mdl.sum(WAITNESS) #mdl.add(mdl.minimize(EXPR)) mdl.add(mdl.minimize(mdl.sum([*[ mdl.max([ mdl.end_of(compositions[i])*players_compositions[k][i] for i in range(numcompositions)]) for k in range (numplayers)], *[-mdl.min([mdl.times(mdl.start_of(compositions[j]),1000*mdl.equal(players_compositions[k][j],0)+ players_compositions[k][j]) + 100*mdl.times(mdl.equal(mdl.start_of(compositions[j]),0),mdl.equal(players_compositions[k][j],0)) for j in range(numcompositions)]) for k in range (numplayers)], -92]))) #[mdl.max(ENDS) for k in range(numplayers)] mdl.write_information()
workers.update(workers3) deliveryworker = { "deliveryworker": mdl.sequence_var([itvs[(h, 2)] for h in range(numdetails)], types=[h for h in range(numdetails)], name="deliveryworker") } workers.update(deliveryworker) for w in WorkerNames: mdl.add(mdl.no_overlap(workers[w])) mdl.add( mdl.minimize( mdl.sum(euro_penalty[i] * mdl.float_div( mdl.max([mdl.end_of(itvs[(i, 2)]) - 480, 0]), mdl.end_of(itvs[(i, 2)]) - 480 + mdl.equal(mdl.end_of(itvs[(i, 2)]) - 480, 0)) for i in range(numdetails)))) #mdl.add(mdl.minimize(mdl.sum(euro_penalty[i] * mdl.float_div(mdl.max([mdl.end_of(itvs[(i, 2)]) - 480, 0]),mdl.max([mdl.end_of(itvs[(i, 2)]) - 480)) for i in range(numdetails))))) #mdl.add(mdl.minimize(mdl.sum(euro_penalty[i] * mdl.max([mdl.step_at(mdl.end_of(itvs[(i, 2)]) - 480,1), 0]) for i in range(numdetails)))) #mdl.add(mdl.minimize(mdl.sum(euro_penalty[i] * mdl.float_div(mdl.max([mdl.exponent(mdl.end_of(itvs[(i, 2)]) - 480)-1, 0]), mdl.exponent(mdl.end_of(itvs[(i, 2)]) - 480)) for i in range(numdetails)))) #mdl.add(mdl.minimize(mdl.sum(euro_penalty[i] * mdl.float_div(mdl.max([mdl.exponent(mdl.power(mdl.end_of(itvs[(i, 2)]) - 480, 0.33))-1, 0]), mdl.exponent(mdl.power(mdl.end_of(itvs[(i, 2)]) - 480, 0.33))) for i in range(numdetails)))) #mdl.add(mdl.minimize(mdl.sum(euro_penalty[i] * mdl.presence_of(itvs[(i, 2)]) for i in range(numdetails)))) print("Solving model....") msol = mdl.solve(FailLimit=100000, TimeLimit=10) print("Solution: ") msol.print_solution()