60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
#!/usr/bin/env python
|
|
# @(#) $Jeannot: test4.py,v 1.5 2004/03/20 17:06:54 js Exp $
|
|
|
|
# A two stage stochastic planification problem
|
|
|
|
# Example taken from:
|
|
# "On Optimal Allocation of Indivisibles under Incertainty"
|
|
# Vladimir I. Norkin, Yuri M. Ermoliev, Andrzej Ruszczynski
|
|
# IIASA, WP-94-021, April 1994 (revised October 1995).
|
|
|
|
from pulp import *
|
|
from random import *
|
|
|
|
C = 50
|
|
B = 500 # Resources available for the two years
|
|
s = 20 # Number of scenarios
|
|
n = 10 # Number of projects
|
|
|
|
N = list(range(n))
|
|
S = list(range(s))
|
|
|
|
# First year costs
|
|
c = [randint(0,C) for i in N]
|
|
# First year resources
|
|
d = [randint(0,C) for i in N]
|
|
# a=debut, b=taille
|
|
interval = [[(randint(0,C), randint(0,C)) for i in N] for j in S]
|
|
# Final earnings
|
|
q = [[randint(ai, ai+bi) for ai,bi in ab] for ab in interval]
|
|
# Second year resources
|
|
delta = [[randint(ai, ai+bi) for ai,bi in ab] for ab in interval]
|
|
|
|
# Variables
|
|
# x : Whether or not to start a project
|
|
x = LpVariable.matrix("x", (N,), 0, 1, LpInteger)
|
|
# y : Whether or not to finish it, in each scenario
|
|
y = LpVariable.matrix("y", (S, N), 0, 1, LpInteger)
|
|
|
|
# Problem
|
|
lp = LpProblem("Planification", LpMinimize)
|
|
|
|
# Objective: expected earnings
|
|
lp += lpDot(x, c) - lpDot(q, y)/float(s)
|
|
|
|
# Resources constraints for each scenario
|
|
for j in S:
|
|
lp += lpDot(d, x) + lpDot(delta[j], y[j]) <= B
|
|
|
|
# We can only finish a project that was started
|
|
for i in N:
|
|
for j in S:
|
|
lp += y[j][i] <= x[i]
|
|
|
|
# Resolution
|
|
lp.solve()
|
|
|
|
# Solution printing
|
|
for i in N:
|
|
print(x[i], "=", x[i].value())
|