;To open this file use NetLogo 6.1.1 (see https://ccl.northwestern.edu/netlogo/) ;Contact info for the model: k.p.h.lange@hva.nl ;We cannot assume any responsibility for the accuracy or reliability of this model globals [ numParticipants noOfWasteShippers j shareInvestmentSame avgWasteGenerated costInfra limitOnWasteInput maxOrganicWaste maxParticipants organicWasteToWPT totalSumObtained attitudeCalc initialLimitWaste revenue cost elecGenerated heatGenerated investmentSame investmentProportionate countParticipants AEParticipants AUParticipants claimantParticipants proprietorParticipants vote_shareInvestmentSame vote_shareInvestmentProportionate initiativeStarted maxCapacityReached prevValue prevValue1 elecPrice heatPrice maximumROI totalWasteGenerated numCannotParticipate numInsufficientBudget countChange numParticipantsOld oldTicks newTicks amtOccupied productionCost globalBudget intentionGlobal weightAttitudeVal weightSNVal weightPBCVal weightAttitudeList weightSNList weightPBCList k initiativeStartedGlobal budgetGlobal weightFinVal weightSustVal weightFinList weightSustList budgetGlobalVal budgetList intentionThreshold callCalculateIntention counterMaxCapacity counterMaxIncentives counterNotAllIncentives costShareSame revenueShareSame digestatePriceLower digestatePriceUpper digestatePriceMean digestatePriceSD digestatePrice digestateGenerated minShare maxRevenue wasteMean wasteSD count1 minBudget countChangeRules ] breed [ waste_shippers waste_shipper ] breed [ participants participant ] participants-own [ budget actualRevenueShare attitude_SustMotive attitude attitudeStrMotive_ROI attitudeStrMotive pbc pbc_excludability pbc_duration pbc_robustness pbc_strength sn initialSustMotive initialStrMotive intention prRole organicWasteQty shareInvestment shareInvestmentProportionate costShare costShareProportionate revenueShare revenueShareProportionate incentiveProvided weightAttitude weightPBC weightSN financialValueEqualShare sustainabilityValueEqualShare valueEqualShare financialValueProportionalShare sustainabilityValueProportionalShare valueProportionalShare weightFin weightSust initiativeJoined didntJoin maxIncentives formulatedRules amountPaid cannotParticipate ] waste_shippers-own [ didntJoin actualRevenueShare maxIncentives budget attitude_SustMotive attitude attitudeStrMotive_ROI attitudeStrMotive pbc pbc_excludability pbc_duration pbc_robustness pbc_strength sn initialSustMotive initialStrMotive intention prRole organicWasteQty shareInvestment shareInvestmentProportionate incentiveProvided weightAttitude weightPBC weightSN costShare costShareProportionate revenueShare revenueShareProportionate financialValueEqualShare sustainabilityValueEqualShare valueEqualShare financialValueProportionalShare sustainabilityValueProportionalShare valueProportionalShare weightFin weightSust initiativeJoined formulatedRules amountPaid cannotParticipate ] to setup clear-all clear-output reset-ticks set noOfWasteShippers 1135 ; number of companies in AZ set costInfra 450000 ; in euros set intentionGlobal 0 create-waste_shippers initialNoOfParticipants [ set color blue setxy random-xcor random-ycor ] ask waste_shippers [ set color yellow ] set avgWasteGenerated 0 set minShare 0 set totalWasteGenerated 0 set budgetList [] set totalSumObtained 0 set organicWasteToWPT 0 set maxCapacityReached false set attitudeCalc 0 set elecPrice [ 0.0768 0.0772 0.0769 0.0773 0.0765 0.0768 0.0755 0.0733 0.0707 0.0690 0.0682 0.0675 ] ;; in euro/kWh set heatPrice 26.06 ;; in euro/GJ set productionCost 85 ;; in euros/ton set digestatePriceLower -5000 ;; in euro/ton set digestatePriceUpper 2000 ;; in euro/ton set digestatePriceMean ((digestatePriceLower + digestatePriceUpper) / 2) ;; mean value of digestate price set digestatePriceSD 1167 ;; standard deviation, calculated using digestatePriceLower and digestatePriceUpper set numParticipants 0 set weightAttitudeList [] set weightPBCList [] set weightSNList [] set weightFinList [] set weightSustList [] set initiativeStarted -1 set j 0 set k 0 set minBudget 0 set numCannotParticipate 0 set globalBudget 0 set intentionThreshold 0 set investmentSame true set prevValue investmentSame set limitOnWasteInput true set callCalculateIntention 0 set maxParticipants 75 set AEParticipants 0 set AUParticipants 0 set claimantParticipants 0 set proprietorParticipants 0 set vote_shareInvestmentSame 0 set vote_shareInvestmentProportionate 0 set numInsufficientBudget 0 set countChange 0 set numparticipantsold 0 set counterMaxCapacity 0 set counterMaxIncentives 0 set wasteMean (min-waste + max-waste) / 2 set wasteSD 20 set count1 0 set counterNotAllIncentives 0 set countChangeRules 0 if provide-incentive? = false [ set incentiveExperiment 0 ] (ifelse ;; intention threshold value is the mean of all possible values of intention incentiveExperiment = -1 [ set intentionThreshold 0.53 ] incentiveExperiment = 0 [ set intentionThreshold 0.44 ] incentiveExperiment = 1 [ set intentionThreshold 0.44 ] incentiveExperiment = 2 [ set intentionThreshold 0.53 ] incentiveExperiment = 3 [ set intentionThreshold 0.62 ]) set digestatePrice random-normal digestatePriceMean digestatePriceSD while [ j < initialNoOfParticipants ] [ set weightAttitudeVal random-normal 0.214 sd set weightAttitudeList fput weightAttitudeVal weightAttitudeList set weightSNVal random-normal 0.307 sd set weightSNList fput weightSNVal weightSNList set weightPBCVal random-normal 0.362 sd set weightPBCList fput weightPBCVal weightPBCList set weightFinVal random-normal 0.57 sd set weightFinList fput weightFinVal weightFinList set weightSustVal random-normal 0.72 sd set weightSustList fput weightSustVal weightSustList set budgetGlobalVal precision (random-float (maxBudget - minBudget) + minBudget) 2 set budgetList fput budgetGlobalVal budgetList set j j + 1 ] ;; for calculating all possible intention values ;set intentionGlobal ((attitudeGlobal * weightAttitudeVal) + (pbcGlobal * weightPbcVal) + (snGlobal * weightSnVal)) set j 0 ask waste_shippers [ if provide-incentive? [ set incentiveProvided incentiveExperiment if incentiveExperiment = -1 [ set incentiveProvided 0 ] ] set organicWasteQty generateOrganicWaste wasteMean wasteSD min-waste max-waste set didntJoin false set initiativeJoined false set maxIncentives false set formulatedRules false set cannotParticipate false set pbc_excludability 0 set pbc_duration 1 ;; updated from 0 to 1 - September 7 set pbc_robustness 0 set pbc_strength 1 set pbc (pbc_excludability + pbc_duration + pbc_robustness + pbc_strength) / 4 set initialStrMotive 0 set weightAttitude item j weightAttitudeList set weightSN item j weightSNList set weightPBC item j weightPBCList set weightFin item j weightFinList set weightSust item j weightSustList set budget item j budgetList set j j + 1 ] set avgWasteGenerated mean [ organicWasteQty ] of waste_shippers set maxOrganicWaste avgWasteGenerated set totalWasteGenerated sum [ organicWasteQty ] of waste_shippers set amtOccupied totalWasteGenerated / totalCapacity if amtOccupied > 1 [ set amtOccupied 1 ] set elecGenerated ( totalCapacity * 1375 * amtOccupied / 1000 ) ;; in kWh set heatGenerated ( totalCapacity * 5.375 * amtOccupied / 1000 ) ;; in GJ set digestateGenerated ( totalCapacity * 0.84 * amtOccupied / 1000 ) ;; in tonne set cost ( productionCost * 12 * totalCapacity * amtOccupied ) / 1000 ;; in euro set maxRevenue ((elecGenerated * 0.0773) + (heatGenerated * heatPrice) + (digestateGenerated * digestatePriceUpper)) * 12 ;; defined for the amount of by-products produced for that round/tick set initialLimitWaste totalCapacity / initialNoOfParticipants set shareInvestmentSame costInfra / initialNoOfParticipants ask waste_shippers [ ifelse limitOnWasteInput = true [ ifelse organicWasteQty > initialLimitWaste [ set initialSustMotive initialLimitWaste / organicWasteQty ] [ set initialSustMotive 1 ] ] [ set initialSustMotive 1 ] set shareInvestmentProportionate ((organicWasteQty / totalWasteGenerated) * costInfra) set costShare ((organicWasteQty / totalWasteGenerated) * cost) set sn initialNoOfParticipants / maxParticipants ] end to go set revenue ((elecGenerated * item k elecPrice) + (heatGenerated * heatPrice) + (digestateGenerated * digestatePrice)) * 12 ;; in euro set k k + 1 if k > 11 [ set k 0 ] if ticks = 12 ;; update digestate price yearly [ set digestatePrice random-normal digestatePriceMean digestatePriceSD ] ifelse ticks = 0 [ set maximumROI ((maxRevenue - cost) / shareInvestmentSame) ] [ ifelse investmentSame = true [ set maximumROI ((maxRevenue - cost) / shareInvestmentSame) ] [ if any? participants [ ask participants [ set minShare min [ shareInvestment ] of participants ] set maximumROI ((maxRevenue - cost) / minShare ) ] ] ] ask waste_shippers [ ;; initial definition for division of revenue ifelse numParticipants > 0 [ set revenueShareSame revenue / (numParticipants + 1) ] [ set revenueShareSame revenue / initialNoOfParticipants ] set revenueShareProportionate ((organicWasteQty / totalWasteGenerated) * revenue) ifelse investmentSame = true [ set shareInvestment shareInvestmentSame set revenueShare revenueShareSame ] [ set shareInvestment shareInvestmentProportionate set revenueShare revenueShareProportionate ] inform-waste_shippers ] ask waste_shippers [ if budget > shareInvestment [ check-intention if maxCapacityReached = true [ ifelse totalSumObtained >= costInfra [ set initiativeStarted 1 ;; initiative can be started stop ] [ set initiativeStarted 0 ;; initiative cannot be started stop ] ] ] ] set numInsufficientBudget (initialNoOfParticipants - (numParticipants + numCannotParticipate )) if numInsufficientBudget > 0 [ if numParticipantsOld = numParticipants [ set newTicks ticks if (newTicks - oldTicks) > 1 [ set countChange 0 ] set countChange countChange + 1 set oldTicks ticks if countChange >= 5 [ set numCannotParticipate numCannotParticipate + numInsufficientBudget ] ] ] ifelse numParticipants + numCannotParticipate = initialNoOfParticipants [ ifelse totalSumObtained >= costInfra [ set initiativeStarted 1 ] [ set initiativeStarted 0 ] ] [ if maxCapacityReached = false [ if proprietorParticipants > 0 or claimantParticipants > 0 [ ask participants [ formulate-rules incentiveProvided ] ask one-of participants with [ prRole = "Claimant" or prRole = "Proprietor" ] [ check-votes ] ] ] ] update-plots if ticks = 23 or initiativeStarted = 1 or initiativeStarted = 0 [ stop ] if any? participants and investmentSame = true [ set shareInvestmentSame costInfra / (numParticipants + 1) ] set numParticipantsOld numParticipants tick end to inform-waste_shippers ifelse numParticipants > 0 [ set maxOrganicWaste totalCapacity / (numParticipants + 1) ] [ set maxOrganicWaste initialLimitWaste ] if budget > shareInvestment [ set callCalculateIntention callCalculateIntention + 1 calculate-intention incentiveProvided ] end to check-intention if maxCapacityReached = false [ if initiativeJoined = false and maxIncentives = false [ ifelse intention >= intentionThreshold [ ifelse organicWasteToWPT + organicWasteQty > totalCapacity and cannotParticipate = false [ set maxCapacityReached true set cannotParticipate true set numCannotParticipate numCannotParticipate + 1 set counterMaxCapacity counterMaxCapacity + 1 ] [ set color pink set initiativeJoined true set numParticipants numParticipants + 1 set breed participants join-initiative incentiveProvided ] ] [ ifelse incentiveExperiment = -1 ;; if all incentives can be provided incrementally [ set incentiveProvided incentiveProvided + 1 if incentiveProvided > 3 and cannotParticipate = false [ set maxIncentives true set cannotParticipate true set numCannotParticipate numCannotParticipate + 1 set counterMaxIncentives counterMaxIncentives + 1 ] ] [ if cannotParticipate = false [ set cannotParticipate true set maxIncentives true set numCannotParticipate numCannotParticipate + 1 set counterNotAllIncentives counterNotAllIncentives + 1 ] ] ] ] ] end to calculate-intention [ incentiveValueParam ] if incentiveValueParam != 0 [ (ifelse incentiveValueParam = 1 ;; values of TPB when incentive 1 is provided [ set attitudeCalc 1 ;; Initialising PBC set pbc_excludability 0 set pbc_duration 1 set pbc_robustness 0 set pbc_strength 1 set pbc (pbc_excludability + pbc_duration + pbc_robustness + pbc_strength) / 4 ;; Initialising SN ifelse numParticipants > 0 [ set sn numParticipants / maxParticipants ] [ set sn initialNoOfParticipants / maxParticipants ] ;; calculating revenue share and based on that attitude strategic motive ifelse investmentSame = true [ set revenueShare revenueShareSame ] [ set revenueShare revenueShareProportionate ] set attitudeStrMotive_ROI ((revenueShare - costShare) / shareInvestment) (ifelse attitudeStrMotive_ROI <= 0 [ set attitudeStrMotive 0 ] attitudeStrMotive_ROI > 0 [ set attitudeStrMotive attitudeStrMotive_ROI / maximumROI if attitudeStrMotive < 0 [ set attitudeStrMotive 0 ] ]) ifelse limitOnWasteInput = false ;; if no limit on amount of waste that can be sent for processing, sustainability motive will be maximum [ set attitude_SustMotive 1 ] [ set attitude_SustMotive maxOrganicWaste / organicWasteQty ;; if there exists a limit on amount of waste that can be sent for processing, the motive will depend on the amount of waste that can be processed if attitude_SustMotive > 1 [ set attitude_SustMotive 1 ;; if there exists a limit on the amount of waste that can be processed but all waste can be processed, sustainability motive will be maximum ] ] ] incentiveValueParam = 2 ;; values of TPB when incentive 2 is provided [ set attitudeCalc 1 ;; initialising PBC set pbc_excludability 0 set pbc_duration 1 set pbc_robustness 1 set pbc_strength 1 set pbc (pbc_excludability + pbc_duration + pbc_robustness + pbc_strength) / 4 ;; initialising sn ifelse numParticipants > 0 [ set sn numParticipants / maxParticipants ] [ set sn initialNoOfParticipants / maxParticipants ] ;; calculating revenue share and based on that attitude strategic motive ifelse investmentSame = true [ set revenueShare revenueShareSame ] [ set revenueShare revenueShareProportionate ] set attitudeStrMotive_ROI ((revenueShare - costShare) / shareInvestment) (ifelse attitudeStrMotive_ROI <= 0 [ set attitudeStrMotive 0 ] attitudeStrMotive_ROI > 0 [ set attitudeStrMotive attitudeStrMotive_ROI / maximumROI if attitudeStrMotive < 0 [ set attitudeStrMotive 0 ] ]) ifelse limitOnWasteInput = false [ set attitude_SustMotive 1 ] [ set attitude_SustMotive maxOrganicWaste / organicWasteQty if attitude_SustMotive > 1 [ set attitude_SustMotive 1 ] ] ] incentiveValueParam = 3 ;; values of TPB when incentive 3 is provided [ set attitudeCalc 1 set pbc_excludability 1 set pbc_duration 1 set pbc_robustness 1 set pbc_strength 1 set pbc (pbc_excludability + pbc_duration + pbc_robustness + pbc_strength) / 4 ifelse numParticipants > 0 [ set sn numParticipants / maxParticipants ] [ set sn initialNoOfParticipants / maxParticipants ] ;; calculating revenue share and based on that attitude strategic motive ifelse investmentSame = true [ set revenueShare revenueShareSame ] [ set revenueShare revenueShareProportionate ] set attitudeStrMotive_ROI ((revenueShare - costShare) / shareInvestment) (ifelse attitudeStrMotive_ROI <= 0 [ set attitudeStrMotive 0 ] attitudeStrMotive_ROI > 0 [ set attitudeStrMotive attitudeStrMotive_ROI / maximumROI if attitudeStrMotive < 0 [ set attitudeStrMotive 0 ] ]) ifelse limitOnWasteInput = false [ set attitude_SustMotive 1 ] [ set attitude_SustMotive maxOrganicWaste / organicWasteQty if attitude_SustMotive > 1 [ set attitude_SustMotive 1 ] ] ]) ] ifelse attitudeCalc = 0 ;; when no incentives have been provided, i.e. when intention is calculated for the first time [ set attitude ( initialStrMotive * weightFin ) + ( initialSustMotive * weightSust ) ] [ ;; when incentive has been provided: incentive value 1 or 2 or 3 set attitude ( attitudeStrMotive * weightFin ) + ( attitude_SustMotive * weightSust ) ] ; calculating final intention set intention ((pbc * weightPBC) + (sn * weightSN) + (attitude * weightAttitude)) end to join-initiative [ incentiveForInitiative ] ifelse limitOnWasteInput = false [ set organicWasteToWPT organicWasteToWPT + organicWasteQty set actualRevenueShare revenueShareProportionate ] [ ifelse organicWasteQty >= maxOrganicWaste [ set organicWasteToWPT organicWasteToWPT + maxOrganicWaste ] [ set organicWasteToWPT organicWasteToWPT + organicWasteQty ] set actualRevenueShare revenueShareSame ] set amountPaid shareInvestment set totalSumObtained totalSumObtained + amountPaid (ifelse incentiveForInitiative = 0 [ set prRole "Authorised Entrant" ;; 29/7 - check if this is a numeric value or a text/string value set AEParticipants AEParticipants + 1 ] incentiveForInitiative = 1 [ set prRole "Authorised User" set AUParticipants AUParticipants + 1 ] incentiveForInitiative = 2 [ set prRole "Claimant" set claimantParticipants claimantParticipants + 1 ] incentiveForInitiative = 3 [ set prRole "Proprietor" set proprietorParticipants proprietorParticipants + 1 ]) end to formulate-rules [ incentiveValueForRules ] if ((incentiveValueForRules = 2 or incentiveValueForRules = 3) and formulatedRules = false) [ set formulatedRules true ;; Payoff rules set shareInvestmentSame costInfra / (numParticipants + 1) set maxOrganicWaste totalCapacity / (numParticipants + 1) set revenueShareSame revenue / (numParticipants + 1) ;; adding new decision-making mechanism set financialValueEqualShare ((revenueShareSame - costShare) / shareInvestmentSame) set sustainabilityValueEqualShare maxOrganicWaste / organicWasteQty if sustainabilityValueEqualShare > 1 [ set sustainabilityValueEqualShare 1 ] set valueEqualShare (weightFin * financialValueEqualShare) + (weightSust * sustainabilityValueEqualShare) set financialValueProportionalShare ((revenueShareProportionate - costShare) / shareInvestmentProportionate) set sustainabilityValueProportionalShare 1 set valueProportionalShare (weightFin * financialValueProportionalShare) + (weightSust * sustainabilityValueProportionalShare) ifelse valueEqualShare > valueProportionalShare [ set vote_shareInvestmentSame vote_shareInvestmentSame + 1 ] [ set vote_shareInvestmentProportionate vote_shareInvestmentProportionate + 1 ] ] end to check-votes set prevValue1 investmentSame ifelse vote_shareInvestmentSame >= vote_shareInvestmentProportionate [ set investmentSame true set limitOnWasteInput true ] [ set investmentSame false set limitOnWasteInput false ] if prevValue1 != investmentSame [ set countChangeRules countChangeRules + 1 ] end to-report generateOrganicWaste [mid dev minWaste maxWaste ] let organicWaste random-normal mid dev if organicWaste < minWaste or organicWaste > maxWaste [ report generateOrganicWaste mid dev minWaste maxWaste ] report organicWaste end