1. Wprowadzenie
W tym ćwiczeniu uruchomisz pierwsze 2 eksperymenty AlphaEvolve w Google Cloud. AlphaEvolve to framework do ewolucyjnego kodowania z wykorzystaniem AI od Google DeepMind. Używa on Gemini do pisania i ulepszania kodu, który jest oceniany na podstawie zdefiniowanego przez Ciebie wskaźnika. Zaczniesz od problemu pakowania kół – prostego zadania geometrycznego, w którym możesz dosłownie obserwować, jak wynik się poprawia. Następnie powtórzysz to w trudniejszym problemie komiwojażera, aby utrwalić wzorzec.
W obu eksperymentach używana jest lokalna ocena – kod kandydata jest uruchamiany na Twoim komputerze, więc nie ma GPU ani klastra do zarządzania. Jedynym użyciem chmury jest interfejs AlphaEvolve API, który generuje kandydatów.

Jakie zadania wykonasz
- Skonfigurujesz eksperyment AlphaEvolve w projekcie Google Cloud.
- Uruchomisz wyszukiwanie ewolucyjne, które lokalnie ulepsza algorytm pakowania kół.
- Odczytasz wynik, ranking i wizualizację najlepszego rozwiniętego programu.
- Powtórzysz pętlę w problemie komiwojażera, aby uogólnić wzorzec.
- Dostosujesz budżet wyszukiwania (kandydaci, współbieżność, model).
Czego potrzebujesz
- Przeglądarka internetowa, np. Chrome.
- Projekt Google Cloud z włączonymi rozliczeniami.
- Python w wersji 3.9 lub nowszej oraz
uv - Podstawowa znajomość Pythona i wiersza poleceń.
To ćwiczenie jest przeznaczone dla inżynierów i programistów AI/ML na wszystkich poziomach. Nie jest wymagana znajomość obliczeń ewolucyjnych.
Szacowany czas potrzebny do ukończenia: 45–60 minut.
Koszt: to ćwiczenie korzysta z lokalnej oceny (bez GPU, bez GKE). Jedyną opłatą jest korzystanie z interfejsu AlphaEvolve API do generowania kandydatów.
Testowane z: biblioteką klienta AlphaEvolve Cloud w wersji 0.1.0, Pythonem w wersji 3.9 lub nowszej, na przykładach circle_packing i tsp.
2. Zanim zaczniesz
Wybierz projekt i włącz interfejs API
- W konsoli Google Cloud wybierz lub utwórz projekt z włączonymi rozliczeniami, a następnie ustaw go w terminalu:
gcloud config set project <YOUR_PROJECT_ID>
- Włącz interfejs Discovery Engine API, który obsługuje AlphaEvolve:
gcloud services enable discoveryengine.googleapis.com
Znajdź identyfikator aplikacji Gemini Enterprise
AlphaEvolve jest obsługiwany przez Gemini Enterprise (podstawowy interfejs REST to Discovery Engine API). W przypadku ustawienia GE_APP_ID potrzebujesz identyfikatora aplikacji, a nie jej nazwy wyświetlanej.
- Otwórz stronę aplikacji Gemini Enterprise w swoim projekcie.
- Kliknij aplikację i skopiuj pole Identyfikator (np.
gemini-enterprise-1234567890_1234567890123).
Uwierzytelnij, sklonuj i zainstaluj
- Uwierzytelnij się za pomocą domyślnych danych logowania aplikacji:
gcloud auth application-default login
- Sklonuj repozytorium z przykładami i otwórz je. Wszystkie polecenia będziesz uruchamiać w głównym katalogu tego repozytorium:
git clone https://github.com/Google-Cloud-AI/alphaevolve-on-googlecloud.git
cd alphaevolve-on-googlecloud
- Utwórz środowisko wirtualne i zainstaluj w nim bibliotekę klienta AlphaEvolve:
uv venv
uv pip install -e ".[dev]"
uv venv tworzy plik .venv w repozytorium; uv pip install -e ".[dev]" instaluje pakiet alpha_evolve (z możliwością edycji) oraz narzędzia testowe. Eksperymenty będziesz uruchamiać za pomocą uv run, które automatycznie korzysta z tego środowiska.
3. Omówienie pętli AlphaEvolve
Zanim cokolwiek uruchomisz, zapoznaj się z 3 elementami, których potrzebuje AlphaEvolve. Jest to model mentalny, którego będziesz używać w każdym eksperymencie.
Program początkowy i EVOLVE-BLOCK
AlphaEvolve przepisuje tylko kod między 2 znacznikami. Wszystko inne w pliku to stała struktura, której nie można zmienić. Otwórz examples/circle_packing/src/program.py – program początkowy to proste pakowanie w pierścienie współśrodkowe:
# EVOLVE-BLOCK-START
"""Constructor-based circle packing for n=26 circles"""
import numpy as np
def construct_packing(n, random_seed: int):
"""Construct an arrangement of 26 circles in a unit square.
The goal is to maximize the sum of their radii.
Returns (centers, radii, sum_of_radii).
"""
rng = np.random.default_rng(random_seed)
centers = np.zeros((n, 2))
# A simple starting pattern — evolution will improve this.
centers[0] = [0.5, 0.5] # one circle in the center
for i in range(8): # 8 in an inner ring
angle = 2 * np.pi * i / 8
centers[i + 1] = [0.5 + 0.3 * np.cos(angle), 0.5 + 0.3 * np.sin(angle)]
for i in range(16): # 16 in an outer ring
angle = 2 * np.pi * i / 16 * rng.uniform(0.9, 1.1)
centers[i + 9] = [0.5 + 0.7 * np.cos(angle), 0.5 + 0.7 * np.sin(angle)]
centers = np.clip(centers, 0.01, 0.99) # keep everything in the square
radii = compute_max_radii(centers, random_seed)
return centers, radii, np.sum(radii)
def compute_max_radii(centers, random_seed: int):
"""Grow each circle to touch its nearest border or neighbor (no overlaps)."""
# ... see src/program.py for the full helper ...
# EVOLVE-BLOCK-END
Wszystko poza EVOLVE-BLOCK-START / EVOLVE-BLOCK-END – w tym funkcja evaluate() i sprawdzanie nakładania się – pozostaje niezmienione. To jest cały trik: Gemini może zaproponować dowolny algorytm pakowania, ale nie może zmienić sposobu oceniania kandydata.
Oceniający i wynik
examples/circle_packing/src/evaluate.py uruchamia każdego kandydata w piaskownicy i zwraca wynik. W przypadku pakowania kół wskaźnikiem jest sum_of_radii, a im wyższy wynik, tym lepiej:
CIRCLE_PACKING_EVALUATION_METRIC = "sum_of_radii"
CIRCLE_PACKING_EVALUATION_INPUTS = {"n": 26}
Jeśli kandydat narusza regułę – koła nakładają się na siebie lub wychodzą poza kwadrat – oceniający zwraca -inf oraz obserwację wyjaśniającą, co poszło nie tak. Te obserwacje są przekazywane do Gemini, aby następna generacja unikała tego samego błędu.
4. Uruchom pierwszy eksperyment
Skonfiguruj eksperyment
W głównym katalogu repozytorium utwórz plik .env na podstawie szablonu pakowania kół:
cp examples/circle_packing/example.env .env
Otwórz plik .env i ustaw tylko identyfikator projektu i aplikacji – wszystko inne ma działające wartości domyślne na potrzeby pierwszego uruchomienia:
PROJECT_ID=<YOUR_PROJECT_ID>
GE_APP_ID=<YOUR_GEMINI_ENTERPRISE_APP_ID>
Wartości domyślne generują kandydatów za pomocą mieszanki modeli Gemini (MODEL_1=gemini-3.5-flash z wagą 0.7, MODEL_2=gemini-3.1-pro-preview z wagą 0.3) i ograniczają wyszukiwanie do MAX_PROGRAMS_EVALUATED=10 z CONCURRENCY=4 – wystarczy, aby szybko zobaczyć działanie pętli.
Rozpocznij ewolucję
Uruchom eksperyment w głównym katalogu repozytorium:
uv run python -m examples.circle_packing.src.run_evolution
Spowoduje to przesłanie programu początkowego, rozpoczęcie wyszukiwania i uruchomienie lokalnej pętli sterowania do momentu ocenienia 10 kandydatów. Ponieważ wywołujesz moduł bezpośrednio (bez otoki), możesz dokładnie zobaczyć, co się uruchamia, i edytować plik, aby eksperymentować.
Dane wyjściowe powinny być podobne do tych:
INFO:alpha_evolve.experiment:Creating a new AlphaEvolve experiment INFO:alpha_evolve.controller:Evolution loop started: 4 sampler(s), 32 evaluator(s), target=10 programs INFO:alpha_evolve.controller:Waiting for the backend to generate candidates... (generated=0, evaluated=0/10, idle=10s) INFO:alpha_evolve.workers:Candidate 1060655338894100 evaluated → sum_of_radii=0.8114 INFO:alpha_evolve.controller:Progress: generated=2, evaluated=1/10, queued=0 ... INFO:alpha_evolve.controller:Stopping criteria met (10/10 programs evaluated).
Wczesni kandydaci zwykle uzyskują wynik w zakresie 0,8–1,0 ; wyszukiwanie poprawia się od tego momentu. Po zakończeniu pętli wyświetla ona programy w rankingu i renderuje najlepsze pakiety za pomocą matplotlib.
Uwaga: rozwiązywanie problemów: PERMISSION_DENIED lub 403 zwykle oznacza, że interfejs Discovery Engine API nie jest włączony w projekcie. Sprawdź ponownie krok „Zanim zaczniesz”. Uruchomienie, które natychmiast kończy się komunikatem „Nie udało się utworzyć eksperymentu”, oznacza, że dane logowania lub GE_APP_ID w pliku .env są nieprawidłowe.
5. Odczytaj wyniki
Uruchomienie wyświetla najlepsze programy uszeregowane według sum_of_radii (im wyższy wynik, tym lepiej). Zwróć uwagę na 2 rzeczy:
- Wynik wzrósł. Najlepszy rozwinięty
sum_of_radiipowinien być lepszy niż układ pierścieni współśrodkowych programu początkowego. Gemini zwykle odkrywa, że koła w pobliżu rogów i krawędzi mogą być większe, i ponownie równoważy wnętrze. - Nieprawidłowi kandydaci są pomijani. Każdy program, który wygenerował nakładające się lub wykraczające poza granice koła, uzyskał wynik
-infi jest pomijany w rankingu – to nie błąd, ale działanie opinii o ograniczeniach.
Masz teraz pełną pętlę: program początkowy -> generowanie -> ocena -> wynik -> powtórzenie. Wszystko inne w AlphaEvolve to wariacja na temat tego, gdzie jest uruchamiana ocena.
6. Rozwijanie prawdziwego wyszukiwania: TSP
Pakowanie kół szybko się zbiega. Aby poczuć, jak wyszukiwanie działa w przypadku bardziej złożonego problemu, rozwiń heurystykę problemu komiwojażera. Wzorzec jest identyczny – zmienia się tylko program początkowy i wskaźnik, a przykład TSP ponownie wykorzystuje plik .env (projekt, budżet i współbieżność).
- Zwiększ budżet w pliku
.env, aby dłuższe wyszukiwanie miało miejsce na poprawę:
# in .env — raise the generation cap and the evaluation target together
MAX_PROGRAMS_GENERATED=20
MAX_PROGRAMS_EVALUATED=20
- Uruchom go w głównym katalogu repozytorium:
uv run python -m examples.tsp.src.run_evolution
Program początkowy to trasa najbliższego sąsiada obejmująca 50 miast; wskaźnik to neg_tour_length (ujemna średnia długość trasy w 5 stałych instancjach, więc im wyższy wynik, tym lepiej). Otwórz examples/tsp/src/program.py i zwróć uwagę, że tylko construct_tour(distances, n) znajduje się w EVOLVE-BLOCK.
Te 2 problemy mają ten sam wzorzec, ale różne elementy:
Problem | Język | Ocena | Wskaźnik (im wyższy wynik, tym lepiej) | Co się rozwija |
| Python | lokalny |
|
|
| Python | lokalny |
|
|
Podczas wyszukiwania obserwuj, jak neg_tour_length rośnie (zbliża się do zera), gdy Gemini wykracza poza najbliższego sąsiada w kierunku ulepszeń w stylu 2-opt / or-opt – strategii, których nie napisałeś.
7. Dostosuj wyszukiwanie
Teraz, gdy oba uruchomienia działają, dostosuj budżet w pliku .env:
MAX_PROGRAMS_EVALUATED– liczba kandydatów do ocenienia. Więcej kandydatów = głębsze wyszukiwanie i wyższy koszt/czas.CONCURRENCY– liczba kandydatów generowanych jednocześnie.MODEL_1/MODEL_2(zMODEL_1_WEIGHT/MODEL_2_WEIGHT) – ważona mieszanka modeli Gemini, która generuje kandydatów w uruchomieniu pakowania kół (moduł TSP odczytuje pojedynczyMODEL). Dozwolone wartości togemini-3.5-flashigemini-3.1-pro-preview. Przesuń wagę w kierunku silniejszego modelu, aby znaleźć lepsze programy w mniejszej liczbie generacji.
Po każdej zmianie uruchom ponownie za pomocą uv run python -m examples.circle_packing.src.run_evolution (lub modułu tsp).
Uwaga: zwiększenie MAX_PROGRAMS_EVALUATED i przejście na większy model zwiększa koszt. Ponieważ to ćwiczenie korzysta z lokalnej oceny, nie ma opłaty za GPU, ale nadal płacisz za korzystanie z interfejsu AlphaEvolve API za każdego wygenerowanego kandydata. Zacznij od małych kroków.
8. Czyszczenie danych
To ćwiczenie korzysta z lokalnej oceny, więc nie ma żadnych rozliczanych elementów – żadnych klastrów, GPU ani wdrożonych usług. Aby całkowicie zresetować płatność:
git clean -xfd # removes .env, .venv, and generated outputs
Uwaga: git clean -xfd usuwa plik .env (w tym ustawienia projektu) i plik .venv. Pomiń ten krok, jeśli chcesz kontynuować eksperymentowanie.
Jeśli projekt został utworzony tylko na potrzeby tego ćwiczenia, usuń go w konsoli, aby zatrzymać wszystkie opłaty.
9. Gratulacje
Gratulacje! Udało Ci się uruchomić pierwsze eksperymenty AlphaEvolve w Google Cloud i rozwinąć 2 algorytmy – pakowanie kół i heurystykę TSP – używając tylko programu początkowego, funkcji oceniania i Gemini.
Czego się nauczysz
- Jak działa pętla AlphaEvolve: program początkowy -> generowanie -> ocena -> wynik -> powtórzenie.
- Umowa EVOLVE-BLOCK , która pozwala wyszukiwaniu optymalizować przepis bez manipulowania wskaźnikiem.
- Jak wyniki i obserwacje dotyczące niepowodzeń kierują następną generacją.
- Jak skonfigurować, uruchomić, odczytać i dostosować eksperyment z lokalną oceną.
Inne ćwiczenia
Są to samodzielne ćwiczenia, które możesz wykonywać w dowolnej kolejności.
- Rozwijanie skompilowanego kodu za pomocą zdalnego oceniającego: rozwijaj algorytm Rust/C++ oceniany przez oceniającego w kontenerze w Cloud Run.
- Rozwijanie dostrajania LLM w GKE + Ray: uruchamiaj złożone, równoległe oceny GPU we własnym klastrze.